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

时间:2019-05-02 11:52:12

标签: android android-architecture-components androidx android-jetpack android-jetpack-navigation

我正在尝试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 个答案:

答案 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;
    }
相关问题