我想知道如何使用导航 Controller 正确处理系统后退按钮操作。在我的应用程序中,我有两个 fragment (例如, fragment 1 和 fragment 2),我在 fragment 1 中有一个 Action ,目的地是 fragment 2。除了一件事之外,一切都运行良好 - 当用户在 fragment2 中按下系统后退按钮时,我想显示一个对话框(例如使用 DialogFragment)来确认退出。实现此行为的最佳方法是什么?如果我在我的主机 fragment 中使用 app:defaultNavHost="true"
那么它会自动返回忽略我的规则。另外,这个组件是干什么用的?
我应该使用“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 应扩展 AppCompatActivity
或 FragmentActivity
并在 Gradle 文件中:
implementation 'androidx.appcompat:appcompat:{lastVersion}'
关于android - 处理 Android 导航组件中的后退按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51043428/