16

我正在尝试使用 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>

从第一步开始,我还需要进行哪些更改才能在工具栏上添加后退按钮。

4

4 回答 4

29

如您所述,导航组件在除顶级之外的所有目的地上显示返回按钮。它使用AppBarConfiguration来确定哪些目的地被视为“顶级”。

所以你需要:
1)创建没有顶级目的地的 AppBarConfiguration
2)调用 3 参数版本setupActionBarWithNavController

AppBarConfiguration abc = new AppBarConfiguration.Builder().build();
NavigationUI.setupActionBarWithNavController(this, navHostFragment.getNavController(), abc)

要自定义“顶级”目标上的向上按钮行为,您可以OnNavigateUpListener在应用栏配置构建器中设置后备:

new AppBarConfiguration.Builder().setFallbackOnNavigateUpListener(listener).build()

来自来源的更多信息:
单击向上按钮调用NavigationUI.navigateUp(NavController, AppBarConfiguration),然后调用NavController.navigateUp()尝试弹出后台堆栈。由于它不能弹回堆栈,它什么也不做并返回 false。在这种情况下,您的后备侦听器将被调用。

于 2019-05-25T17:50:40.403 回答
3

返回按钮显示为onSupportNavigateUp()方法 return 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;
    }
于 2020-11-26T06:43:03.077 回答
1

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-在片段中可以在按下后退按钮(不是向上按钮)时收听:

    private fun setupBackPress() {
    requireActivity()
        .onBackPressedDispatcher
        .addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() { 
            }
        })
}
于 2020-04-23T03:52:04.437 回答
1

调用时setUpActionBarWithNavCntroller,您必须重写该函数onSupportNavigateUp,如下所示:

override fun onSupportNavigateUp(): Boolean {
    return findNavController(R.id.navHostFragment).navigateUp() 
            || super.onSupportNavigateUp()
}
于 2020-03-14T13:43:13.580 回答