使用Android导航组件拦截向后导航

时间:2020-06-19 20:31:29

标签: android navigation toolbar back

我试图在退出当前片段/活动之前拦截Android应用程序上的向后导航以运行一些代码。

该应用程序正在使用Android导航组件,该组件已连接到底部导航栏和工具栏。堆栈不为空时,工具栏将显示“后退”按钮。

我想要实现的是在退出片段之前显示一个自定义对话框,询问用户是否要保存数据。我的片段包含一些EditText字段和一个保存按钮,应按一下以将数据保存到存储库。如果用户不这样做,则返回时应显示弹出窗口。

我设法使用“ OnBackPressedCallback”拦截了android后退按钮,但工具栏的后退按钮仍将关闭片段。

有什么方法可以拦截这两种方法(从工具栏按钮返回,并使用android后退按钮)?

谢谢

2 个答案:

答案 0 :(得分:1)

您是否尝试过在工具栏上使用导航侦听器?

https://developer.android.com/reference/android/widget/Toolbar#setNavigationOnClickListener(android.view.View.OnClickListener)

您必须分别处理这两种情况,这种情况没有单一方法。

答案 1 :(得分:1)

您可以查看 NavigationUI.setupWithNavController( toolbar, navController, appBarConfiguration ) 的代码,它向您展示了如何为工具栏实现向上导航。

这是我的解决方案:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    // default toolbar setup with navigation components
    final NavController navController = Navigation.findNavController( view );
    final AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder( navController.getGraph() ).build();
    NavigationUI.setupWithNavController( toolbar, navController, appBarConfiguration );

    // own changes like icon and dialog
    toolbar.setNavigationIcon( R.drawable.ic_close_24 );
    toolbar.setNavigationOnClickListener( v -> new AlertDialog.Builder( requireContext() )
        .setMessage( R.string.abort_editing )
        .setPositiveButton( R.string.dialog_button_close, (dialog, whichButton) -> NavigationUI.navigateUp( navController, appBarConfiguration ) )
        .setNegativeButton( R.string.dialog_button_cancel, null )
        .show() );
}