AppCompatActivity跳转Fragment时报ActivityNotFoundException的问题咨询
错误根源
你触发报错的核心原因是混淆了Activity与Fragment的组件本质:
startActivity()方法只能唤起系统注册的Activity组件,你在代码中构造的显式Intent以SupportFragment.class作为目标,系统会按照规则去AndroidManifest.xml中查找同名的已注册Activity,找不到就直接抛出ActivityNotFoundException。- Fragment是依附于宿主Activity存在的UI片段,不属于可被Intent唤起的独立系统组件,本身不需要、也不能在AndroidManifest.xml中声明,不存在直接从Activity“跳转到Fragment”的系统调用链路。
正确实现方案
结合你从LoginActivity点击按钮展示SupportFragment的需求,有两种可落地的实现方式:
方案1:在当前LoginActivity内直接替换Fragment(最适配现有逻辑)
如果你的需求是在LoginActivity的界面内嵌入展示SupportFragment,不需要跳转新的独立页面,直接通过Fragment事务完成切换即可,完全不需要使用Intent:
- 先在LoginActivity的布局文件中预留用于承载Fragment的容器,例如一个带唯一id的
FrameLayout - 重写按钮点击事件的逻辑,替换原来错误的Intent跳转代码:
supportLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 初始化目标SupportFragment SupportFragment supportFragment = new SupportFragment(); // 通过Fragment事务完成容器内容替换 getSupportFragmentManager() .beginTransaction() .replace(R.id.fragment_container, supportFragment) // 替换为你布局中容器的实际id .addToBackStack(null) // 可选:将事务加入返回栈,按下返回键时可回到之前的界面状态 .commit(); } });
方案2:用独立宿主Activity承载SupportFragment(适合Support页面需要独立导航的场景)
如果你需要把SupportFragment作为独立页面展示,不能嵌入在LoginActivity的布局容器中,就需要新建一个空的AppCompatActivity作为Fragment的宿主(例如命名为SupportContainerActivity),将SupportFragment加载到这个宿主中,再通过Intent跳转到这个宿主Activity:
- 编写宿主Activity的逻辑,在页面创建时自动加载SupportFragment:
public class SupportContainerActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 为宿主Activity设置简单的Fragment承载容器 FrameLayout container = new FrameLayout(this); container.setId(R.id.fragment_container); setContentView(container); // 加载SupportFragment,避免页面重建时重复添加 if (savedInstanceState == null) { getSupportFragmentManager() .beginTransaction() .replace(R.id.fragment_container, new SupportFragment()) .commit(); } } }
- 将新建的
SupportContainerActivity声明到AndroidManifest.xml文件中 - 修改LoginActivity中按钮的点击事件,将Intent的目标从SupportFragment替换为宿主Activity:
supportLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 注意此处传入的是宿主Activity,而非Fragment类 Intent supportIntent = new Intent(getApplicationContext(), SupportContainerActivity.class); startActivity(supportIntent); } });
注意:如果需要向SupportFragment传递参数,可将参数放入启动宿主Activity的Intent中,等宿主加载Fragment时,再从Intent中取出参数设置给目标Fragment即可。
内容的提问来源于stack exchange,提问作者RAMESH BOYEE
相关产品推荐
相关产品推荐

