android - 处理 Android 导航组件中的后退按钮

标签 android navigation fragment android-jetpack

我想知道如何使用导航 Controller 正确处理系统后退按钮操作。在我的应用程序中,我有两个 fragment (例如, fragment 1 和 fragment 2),我在 fragment 1 中有一个 Action ,目的地是 fragment 2。除了一件事之外,一切都运行良好 - 当用户在 fragment2 中按下系统后退按钮时,我想显示一个对话框(例如使用 DialogFragment)来确认退出。实现此行为的最佳方法是什么?如果我在我的主机 fragment 中使用 app:defaultNavHost="true" 那么它会自动返回忽略我的规则。另外,这个组件是干什么用的?

enter image description here

我应该使用“pop to”吗?

最佳答案

最新更新 - 2019 年 4 月 25 日

新版本 androidx.activity ver. 1.0.0-alpha07带来一些变化

更多解释见android官方指南:Provide custom back navigation

例子:

public class MyFragment extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // This callback will only be called when MyFragment is at least Started.
        OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
            @Override
            public void handleOnBackPressed() {
                // Handle the back button event
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);

        // The callback can be enabled or disabled here or in handleOnBackPressed()
    }
    ...
}

旧更新

更新日期:2019 年 4 月 3 日

现在简化了。更多信息 here

例子:

requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), this);

@Override
public boolean handleOnBackPressed() {
    //Do your job here
    //use next line if you just need navigate up
    //NavHostFragment.findNavController(this).navigateUp(); 
    //Log.e(getClass().getSimpleName(), "handleOnBackPressed");
    return true;
    }

已弃用(自版本 1.0.0-alpha06 2019 年 4 月 3 日):

自从 this , 只需使用 JetPack 即可实现在您的 fragment 中实现 OnBackPressedCallback 并将其添加到 Activity 中: getActivity().addOnBackPressedCallback(getViewLifecycleOwner(),this);

您的 fragment 应如下所示:

public MyFragment extends Fragment implements OnBackPressedCallback {

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        
        getActivity().addOnBackPressedCallback(getViewLifecycleOwner(),this);
}
    
    @Override
    public boolean handleOnBackPressed() {
        //Do your job here
        //use next line if you just need navigate up
        //NavHostFragment.findNavController(this).navigateUp(); 
        //Log.e(getClass().getSimpleName(), "handleOnBackPressed");
        return true;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        getActivity().removeOnBackPressedCallback(this);
    }
}

统一更新: 您的 Activity 应扩展 AppCompatActivityFragmentActivity 并在 Gradle 文件中:

 implementation 'androidx.appcompat:appcompat:{lastVersion}'

关于android - 处理 Android 导航组件中的后退按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51043428/

相关文章:

android - 在 android 的 Ionic 项目中的位置

pdf - 在 indesign 中制作按钮转到导出 PDF 中的特定页面

navigation - Plone:如何对文件夹项目进行排序

android - 在 fragment 中禁用屏幕捕获

android - Fragment.setAllowEnterTransitionOverlap(false);不起作用(进入和退出动画重叠)

android - 免安装应用发布错误 : targeting apk difference

java - 复选框文本,将实际复选框推到左侧

java - 如何等待异步方法

navigation - 如何在 vuetify 主抽屉/导航中创建子菜单

java - Android:约束布局中的多个 fragment