Android启动指定Activity加载特定Fragment失效重启如何解决
问题根因
你写的代码存在逻辑层级错误:
- Fragment事务完全绑定当前执行代码的宿主Activity(即
DetailOrderActivity)的FragmentManager,你在当前页调用replace操作的是DetailOrderActivity自身布局里的容器,根本无法操作还未启动的MainActivity的视图层级 - 你提交完不属于当前页有效逻辑的事务后,立刻启动新Activity并销毁当前页,会导致当前页销毁阶段异步执行的Fragment事务找不到对应容器,触发状态异常,最终引发应用异常重启。
正确实现方案
实现逻辑拆分到跳转发起页和目标Activity两端处理,不要跨页面操作不属于当前宿主的Fragment事务:
1. 跳转发起页(DetailOrderActivity)逻辑
仅通过Intent传递需要加载的目标Fragment标识即可,删除当前页无效的Fragment事务代码:
Intent i = new Intent(DetailOrderActivity.this, MainActivity.class); // 传入目标Fragment标识,告知MainActivity需要加载的页面 i.putExtra("load_fragment_flag", "history_order"); startActivity(i); finish();
2. 目标页(MainActivity)逻辑
在自身布局加载完成后,判断启动Intent携带的参数,在自己的FragmentManager上执行事务加载指定Fragment,注意加首次创建判断避免重复加载:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 先加载MainActivity自身布局,确保Fragment容器R.id.Container已完成初始化 setContentView(R.layout.activity_main); // 仅Activity首次创建时处理Intent传参,配置变更重建时走系统自带的Fragment状态恢复,避免重复加载 if (savedInstanceState == null) { String fragmentFlag = getIntent().getStringExtra("load_fragment_flag"); Fragment targetFragment = null; if ("history_order".equals(fragmentFlag)) { targetFragment = new HistoryFragment(); } // 可在此处扩展其他指定Fragment的匹配逻辑 if (targetFragment != null) { getSupportFragmentManager().beginTransaction() .replace(R.id.Container, targetFragment) .commit(); } } }
注意事项
- 所有Fragment事务必须由Fragment对应的宿主Activity自己执行,禁止在A页面的代码里直接操作B页面的FragmentManager
- 给Fragment传参时请通过
setArguments(Bundle)方式传递,不要直接通过Fragment带参构造方法传值,避免Activity重建时参数丢失 - 必须加
savedInstanceState == null判断,否则屏幕旋转、系统回收后台Activity后重建时,会出现Fragment重复叠加的问题
内容的提问来源于stack exchange,提问作者Chicoi Gonzales
相关产品推荐
相关产品推荐

