使用导航组件处理工具栏后退按钮
Posted
技术标签:
【中文标题】使用导航组件处理工具栏后退按钮【英文标题】:Handle Toolbar back button with Navigation component 【发布时间】:2020-02-19 08:08:00 【问题描述】:我遵循单一活动方法。我有导航工具栏,每当我转到其他屏幕(片段)而不是汉堡图标时,我都会有后退箭头。
我想要实现的是,使用按下工具栏后退箭头的动作弹出我当前的片段。
我试过了
requireActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true)
@Override
public void handleOnBackPressed()
NavHostFragment.findNavController(EventDetailsFragment.this)
.navigate(R.id.action_nav_event_details_to_nav_home);
);
但没有接到那边的电话,我通过在调试模式下运行应用程序进行了检查。
【问题讨论】:
这个有什么解决办法吗? 【参考方案1】:在Activity
上创建:
navController = findNavController(R.id.my_nav_host)
//my_nav_host defined in activity xml file as id of fragment or FragmentContainerView
val appBarConfiguration = AppBarConfiguration(navController.graph)
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration)
和:
override fun onOptionsItemSelected(item: MenuItem): Boolean
if (item.itemId == android.R.id.home)
onBackPressed()
return true
return true
然后在你的片段中:
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
val callback: OnBackPressedCallback =
object : OnBackPressedCallback(true /* enabled by default */)
override fun handleOnBackPressed()
//do what you want here
requireActivity().onBackPressedDispatcher.addCallback(this, callback)
【讨论】:
如何在父活动中获得 navController 访问权限?【参考方案2】:在父活动中添加此代码
添加 onCreate 方法
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
在父活动中也添加此方法
@Override
public boolean onSupportNavigateUp()
return super.onSupportNavigateUp();
【讨论】:
使用 cod 创建片段。私人无效 addNewFragment() addNewAnnouncementsFragment = AddNewAnnouncementsFragment.newInstance(AnnouncementsActivity.this); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.fragment_frame, addNewAnnouncementsFragment, "ADD_NEW_ANNOUNCEMENT"); ft.commit(); 嗨,我在按下工具栏后退按钮时收到回调。我如何从这里检查我当前的 Fragment 或 Destination Fragment。 in onbackpress-> Fragment oldFragment = getFragmentManager().findFragmentByTag("ADD_NEW_ANNOUNCEMENT"; if (oldFragment != null) getFragmentManager().beginTransaction().remove(oldFragment).commit(); 我正在使用导航组件(导航图)。在使用它时,我不需要做Fragment oldFragment = getFragmentManager().findFragmentByTag("ADD_NEW_ANNOUNCEMENT");
中的任何一个。【参考方案3】:
如果您在 xml 中使用custom toolbar
,您可以考虑使用以下方法
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_chat)
setSupportActionBar(activity_chat_toolbar)
activity_chat_toolbar.setNavigationOnClickListener
onBackPressed() <-- custom toolbar's back press
val navHostFrag =
supportFragmentManager.findFragmentById(R.id.chat_fragment_container_view) as NavHostFragment
navController = navHostFrag.navController
navController.setGraph(R.navigation.chat_nav_graph, intent.extras)
setupActionBarWithNavController(navController)
// Function to check startDestination to finish() the parent activity
override fun onBackPressed()
if(navController.graph.startDestination == navController.currentDestination?.id)
finish()
else
super.onBackPressed()
override fun onSupportNavigateUp(): Boolean
return navController.navigateUp() || super.onSupportNavigateUp()
【讨论】:
【参考方案4】:Toolbar toolbar = findviewbyid(R.id.toolbar);
toolbar.setnavigationonclicklistener(new view.onclicklistener()
code here
);
setsupportactionbar(toolbar);
【讨论】:
嗨,每当我按下工具栏图标时,我都会在这里收到回调,即使是汉堡图标也是如此。以上是关于使用导航组件处理工具栏后退按钮的主要内容,如果未能解决你的问题,请参考以下文章
Android - 将 ActionBar 后退按钮切换为导航按钮