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

新手上路,请多包涵

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

在此处输入图像描述

我应该使用“pop to”可能吗?

原文由 Kiryl Tkach 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 595
2 个回答

最新更新 - 2019 年 4 月 25 日

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

android官方指南中的更多解释: 提供自定义后退导航

例子:

 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()
    }
    ...
}

旧更新

UPD:2019 年 4 月 3 日

现在它简化了。更多信息 在这里

例子:

 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;
    }

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

既然 这样,它可以在您的片段中使用 JetPack 实现 OnBackPressedCallback 并将其添加到活动中: getActivity().addOnBackPressedCallback(getViewLifecycleOwner(),this);

您的片段应如下所示:

 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);
    }
}

UPD: 您的活动应扩展 AppCompatActivityFragmentActivity 并在 Gradle 文件中:

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

原文由 Jurij Pitulja 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您使用的是 NavController,这是一个答案:

 Navigation.findNavController(view).navigateUp();

不要尝试破解其他方法,例如在事务中使用 FragmentManager 和 replace() 替换片段。 NavController 负责这个。

原文由 Ben 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题