如何在返回键按下时阻止存在未保存更改的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
相关产品推荐
相关产品推荐

