我正在尝试androidx导航组件,并使用工具栏和容器设置了我的活动。我正在我的应用程序的间歇屏幕之一中执行此操作,该屏幕具有很多内部导航/步骤,并且我认为我可以尝试使用导航拱门组件。
由于这是一个间歇性屏幕,所以我想从第一个屏幕本身开始在工具栏上显示一个后退按钮。
我已经在主机活动的onCreate()方法中使用以下代码设置了工具栏,
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
NavigationUI.setupActionBarWithNavController(this, navHostFragment.getNavController());
我可以在图形的第二个屏幕上看到向后按钮/向后箭头,但在第一个屏幕上看不到。
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/navigation"
app:startDestination="@id/listing">
<fragment
android:id="@+id/listing"
android:name=".ui.ItemsListingFragment"
android:label="Items"
tools:layout="@layout/items_listing" >
<action
android:id="@+id/listToQuantity"
app:destination="@id/quantity"
/>
<action
android:id="@+id/listToReason"
app:destination="@id/reason"
/>
</fragment>
<fragment
android:id="@+id/quantity"
android:name=".ui.ItemQuanitySelectionFragment"
android:label="Items"
tools:layout="@layout/fragment_item_quanity_selection" >
<action
android:id="@+id/quantityToReason"
app:destination="@id/reason"
/>
</fragment>
<fragment
android:id="@+id/reason"
android:name=".ui.ItemReasonFragment"
android:label="Items"
tools:layout="@layout/fragment_item_reason">
</fragment>
</navigation>
从第一步开始,要在工具栏上添加后退按钮,我还需要进行哪些更改。
答案 0 :(得分:2)
如前所述,导航组件在除顶级目的地之外的所有目的地均显示后退按钮。它使用AppBarConfiguration
确定哪些目的地被视为“顶级”。
因此您需要:
1)创建没有顶级目标的AppBarConfiguration
2)调用3参数版本的setupActionBarWithNavController
AppBarConfiguration abc = new AppBarConfiguration.Builder().build();
NavigationUI.setupActionBarWithNavController(this, navHostFragment.getNavController(), abc)
答案 1 :(得分:1)
调用setUpActionBarWithNavCntroller
时,您必须重写函数onSupportNavigateUp
,如下所示:
override fun onSupportNavigateUp(): Boolean {
return findNavController(R.id.navHostFragment).navigateUp()
|| super.onSupportNavigateUp()
}
答案 2 :(得分:0)
1-我创建了一个界面来显示/隐藏导航主机活动中的按钮。
interface ShowUpButtonListener {
fun showUpButton()
fun hideUpButton()
}
2-这是活动如何实现显示/隐藏按钮的接口方法:
override fun showUpButton() {
val navController = this.findNavController(R.id.nav_host)
val listener = AppBarConfiguration.OnNavigateUpListener { navController.navigateUp() }
val abc = AppBarConfiguration.Builder().setFallbackOnNavigateUpListener(listener).build()
NavigationUI.setupActionBarWithNavController(this, navController, abc)
}
override fun hideUpButton() {
val navController = this.findNavController(R.id.nav_host)
NavigationUI.setupActionBarWithNavController(this, navController)
}
3-这里是按下向上按钮时活动中的方法。如果在开始目标中,则实现onBackPressed():
override fun onSupportNavigateUp(): Boolean {
val navController = this.findNavController(R.id.nav_host)
if(!navController.navigateUp()){ // When in start destination
onBackPressed()
}
return navController.navigateUp()
}
4-在片段中创建显示按钮侦听器属性:
private lateinit var showUpButtonListener: ShowUpButtonListener
5-将属性分配给上下文活动:
override fun onAttach(context: Context) {
super.onAttach(context)
if(context is ShowUpButtonListener){
showUpButtonListener = context
}
}
6-在片段调用中,从界面属性中隐藏或显示按钮:
fun someFunction() {
showUpButtonListener.showUpButton()
}
7-在片段中,只要按下后退按钮(NOT UP按钮),便可以收听:
private fun setupBackPress() {
requireActivity()
.onBackPressedDispatcher
.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
}
})
}
答案 3 :(得分:0)
后退按钮显示为onSupportNavigateUp()
方法返回true
。
您需要覆盖onSupportNavigateUp()
方法。
@Override
protected void onCreate(Bundle savedInstanceState) {
//
setSupportActionBar(mToolbar)
mNavController = getNavController();
mAppBarConfiguration = new AppBarConfiguration.Builder().build();
NavigationUI.setupActionBarWithNavController(this, mNavController, mAppBarConfiguration);
}
@Override
public boolean onSupportNavigateUp() {
//
if (!(mNavController.navigateUp() || super.onSupportNavigateUp())) {
onBackPressed();
}
return true;
}