You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android重写onBackPressed因无窗口焦点失效问题如何解决?

问题根因
  1. 启动逻辑顺序错误:你在HomeFragment中先调用requireActivity().finish()销毁了MainActivity,再启动MapActivity,上下文状态异常;如果确实需要销毁MainActivity,也应该放在startActivity之后执行。
  2. 返回逻辑执行顺序错误:你在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:36:05