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

如何在返回键按下时阻止存在未保存更改的Fragment关闭?

在Activity的onBackPressed中通过NavController检查当前Fragment的未保存状态

要实现你想要的逻辑,Navigation组件没有直接提供getCurrentFragment()方法,但可以通过NavHostFragment的子Fragment管理器获取当前活跃的Fragment,具体实现如下:

完整代码实现

@Override
public void onBackPressed() {
    // 获取布局中对应的NavHostFragment
    NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager()
            .findFragmentById(R.id.nav_host_fragment_user);
            
    if (navHostFragment != null) {
        // 获取当前处于前台的活跃Fragment
        Fragment currentFragment = navHostFragment.getChildFragmentManager()
                .getPrimaryNavigationFragment();
                
        // 判断是否为目标Fragment并检查未保存更改
        if (currentFragment instanceof UserDataFragment) {
            UserDataFragment userDataFragment = (UserDataFragment) currentFragment;
            if (userDataFragment.hasUnsavedChanges()) {
                // 弹出确认对话框,避免用户误操作丢失数据
                new AlertDialog.Builder(this)
                        .setTitle("未保存的更改")
                        .setMessage("当前有未保存的修改,确定要退出吗?")
                        .setPositiveButton("确定", (dialog, which) -> finish())
                        .setNegativeButton("取消", (dialog, which) -> dialog.dismiss())
                        .show();
                return; // 暂停执行finish,等待用户选择
            }
        }
    }
    
    // 无未保存更改或非目标Fragment,正常退出Activity
    finish();
}

关键说明

  • 获取NavHostFragment:通过getSupportFragmentManager().findFragmentById()拿到布局中注册的NavHostFragment实例,它是Navigation组件管理Fragment导航的容器。
  • 获取当前Fragment:使用getChildFragmentManager().getPrimaryNavigationFragment()是Navigation组件推荐的方式,能准确获取当前显示在前台的Fragment,比遍历返回栈更高效。
  • 状态检查:确保UserDataFragment中正确实现hasUnsavedChanges()方法,比如对比输入内容与初始数据、检查表单是否有修改等。

内容的提问来源于stack exchange,提问作者devops

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:06:01