我正在尝试拦截Android应用程序上的后退导航以在退出当前片段/活动之前运行一些代码。
该应用程序使用的是Android导航组件,连接到底部导航栏和工具栏。当堆栈不为空时,工具栏将显示后退按钮。
我试图实现的是,在退出片段之前显示一个自定义对话框,询问用户是否要保存数据。我的片段包含一些 EditText 字段和一个保存按钮,应按下该按钮将数据保存到存储库。如果用户不这样做,则返回时应显示弹出窗口。
我已经设法使用"OnBackPressedCallback"拦截了android后退按钮,但工具栏后退按钮仍然会关闭片段。
有没有办法拦截这两种方法(从工具栏按钮返回,并使用 android 后退按钮(?
谢谢
您可以查看 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() );
}
您是否尝试过在工具栏上使用导航侦听器?
https://developer.android.com/reference/android/widget/Toolbar#setNavigationOnClickListener(android.view.View.OnClickListener(
您必须分别处理这两种情况,这种情况没有单一的方法。
我遇到了类似的问题,但另外我的设置中有一个抽屉菜单。 而且我只需要在一个特定的片段中拦截 UP 导航操作。 此外,事实证明,一旦您添加NavigationOnCLickListener 你永远不会摆脱它。所以这是没有选择的。
对我有用的是在所有导航完成后将工具栏设置为支持操作栏。
现在,UP操作事件出现在onOptionItemSelected((中 在这里,我可以使用 NavController.currentDestination 来检查我当前是哪个片段,我可以在这里选择是打开抽屉、向上导航(或其他地方(还是干脆什么都不做。
// in Activity.onCreate()
// do your setup of Navigation UI
setSupportActionBar(toolbar)
// add (it won't work without)
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
return super.onCreateOptionsMenu(menu)
}
// and then
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (navController?.currentDestination?.id) {
R.id.dontAllowUpNavigationFragment -> { }
in topLevelDestinationIds -> { binding.drawerLayout.open() }
else -> { navController?.navigateUp() }
}
return true
}