在导航图的第一个屏幕上的工具栏上显示后退按钮

Abh*_*oop 3 android android-architecture-components android-jetpack androidx android-jetpack-navigation

我正在尝试androidx导航组件,并使用工具栏和容器设置了我的活动。我正在我的应用程序的间歇屏幕之一中执行此操作,该屏幕具有许多内部导航/步骤,并且我认为我可以尝试使用导航拱门组件。

由于这是一个间歇性屏幕,因此我想从第一个屏幕本身开始在工具栏上显示一个后退按钮。

我已经在主机活动的onCreate()方法中使用以下代码设置了工具栏,

 setSupportActionBar(toolbar);
 if (getSupportActionBar() != null) {
   getSupportActionBar().setDisplayHomeAsUpEnabled(true);
   getSupportActionBar().setDisplayShowHomeEnabled(true);
 }
NavigationUI.setupActionBarWithNavController(this, navHostFragment.getNavController());
Run Code Online (Sandbox Code Playgroud)

我可以在图表的第二个屏幕上看到后退按钮/后退箭头,但在第一个屏幕上却看不到。

<?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>
Run Code Online (Sandbox Code Playgroud)

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

dha*_*sky 9

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

因此,您需要:
1)在没有顶级目标的情况下创建AppBarConfiguration
2)调用3参数版本的setupActionBarWithNavController

AppBarConfiguration abc = new AppBarConfiguration.Builder().build();
NavigationUI.setupActionBarWithNavController(this, navHostFragment.getNavController(), abc)
Run Code Online (Sandbox Code Playgroud)

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

new AppBarConfiguration.Builder().setFallbackOnNavigateUpListener(listener).build()
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,出现后退按钮但不知道如何返回 (2认同)