Android重写onBackPressed因无窗口焦点失效问题如何解决?
问题根因
- 启动逻辑顺序错误:你在HomeFragment中先调用
requireActivity().finish()销毁了MainActivity,再启动MapActivity,上下文状态异常;如果确实需要销毁MainActivity,也应该放在startActivity之后执行。 - 返回逻辑执行顺序错误:你在MapActivity的
onBackPressed中优先执行了super.onBackPressed(),该方法默认会触发当前Activity的销毁流程,导致MapActivity提前失去窗口焦点,系统直接丢弃了返回键事件,后续的跳转逻辑自然无法执行,对应你看到的控制台警告。
解决办法
分两种适用场景:
场景1:期望返回时保留MainActivity原有状态(推荐)
这种场景下系统自带的回退栈就可以满足需求,不需要自己写跳转逻辑:
- 修改HomeFragment的点击逻辑,删除销毁MainActivity的代码:
// HomeFragment.java 修正后代码 buttonMap.setOnClickListener(view -> { Intent i = new Intent(rootView.getContext(), MapActivity.class); startActivity(i); });
- 直接删除MapActivity中重写的
onBackPressed方法即可,系统默认点击返回键会自动回到回退栈中的MainActivity。
场景2:启动MapActivity时必须销毁原有MainActivity,返回时需要新建MainActivity
- 先修正HomeFragment的启动顺序:
// HomeFragment.java 修正后代码 buttonMap.setOnClickListener(view -> { Intent i = new Intent(rootView.getContext(), MapActivity.class); startActivity(i); requireActivity().finish(); // 将销毁操作移到startActivity之后 });
- 再修正MapActivity的onBackPressed执行顺序,先执行跳转再销毁当前页面:
// MapActivity.java 修正后代码 @Override public void onBackPressed() { Intent i = new Intent(this, MainActivity.class); // 直接使用当前Activity作为上下文,避免ctx为空或类型错误 startActivity(i); finish(); }
内容的提问来源于stack exchange,提问作者Lkmuraz
相关产品推荐
相关产品推荐

