Android导航组件中的处理后退按钮 [英] Handling back button in Android Navigation Component

查看:1329
本文介绍了Android导航组件中的处理后退按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'd like to know how properly handle system back button action using Navigation Controller. In my app I have two fragments (for ex. fragment1 and fragment2) and I have an action in fragment1 with destination to fragment2. Everything works well except one thing - when user presses system back button in fragment2 I want to show a dialog (using DialogFragment for example) to confirm exit. What is the best way to implement this behavior? If I use app:defaultNavHost="true" in my host fragment then it automatically goes back ignoring my rules. And, additionally, what is this component for?

我应该使用流行于"吗?

Should I use "pop to" may be?

推荐答案

最新更新-2019年4月25日

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

Android官方指南中的更多说明:提供自定义后退导航

More explanations in android official guide: 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()
    }
    ...
}

旧更新

UPD:2019年4月3日

现在将其简化.更多信息此处

Now its simplified. More info 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日):

Deprecated (since Version 1.0.0-alpha06 April 3rd, 2019) :

由于,它可以实现在片段中使用 JetPack 实现OnBackPressedCallback 并将其添加到活动中: getActivity().addOnBackPressedCallback(getViewLifecycleOwner(),this);

Since this, it can be implemented just using JetPack implementation OnBackPressedCallback in your fragment and add it to activity: 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文件中扩展:

UPD: Your activity should extends AppCompatActivityor FragmentActivity and in Gradle file:

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

这篇关于Android导航组件中的处理后退按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆