工具栏后退按钮因起始目的地而隐藏

use*_*265 3 android android-jetpack android-jetpack-navigation

背景

我试图为每个模块使用一个活动,其中每个活动都有自己的导航图。因此,导航从一个动态功能模块中的活动转到另一个动态功能模块中的另一活动。

功能 1/活动 A -> 功能 2/活动 B

ActivityA 只是调用基本startActivity方法来启动 ActivityB。

问题

因为从ActivityB技术上讲,它的片段位于起始目的地。即使我的后退堆栈中有后退按钮,它也不会显示后退按钮ActivityA。有什么办法可以解决这个问题吗?

PS:由于ActivityA&ActivityB位于两个独立的模块中,我避免将它们放在一张图表下。对于活动转换,我只是startActivity通过intent使用创建来调用className

更新- 即使我使用导航控制器从 ActivityA 的片段导航到 ActivityB,问题仍然存在。

ActivityB.xml

</layout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/main_toolbar"
            app:navigationIcon="@drawable/ic_back"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:title="@string/title" />

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/host_container"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            app:defaultNavHost="true"
            app:navGraph="@navigation/landing_graph" />
    </LinearLayout>

</layout>
Run Code Online (Sandbox Code Playgroud)

活动B.kt

internal class ActivityB : AppCompatActivity() {

    private var navController : NavController? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val toolbar = binding.mainToolbar
        navController = supportFragmentManager.findFragmentById(R.id.host_container) as NavHostFragment).navController
        setSupportActionBar(toolbar)
        toolbar.setNavigationOnClickListener { onBackPressed() }
        toolbar.setupWithNavController(navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        return navController.navigateUp() || super.onSupportNavigateUp()
    }
}
Run Code Online (Sandbox Code Playgroud)

登陆图.xml

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    app:startDestination="@id/blankFragment">
    <fragment
        android:id="@+id/blankFragment"
        android:name="com.example.cashdog.cashdog.BlankFragment"
        android:label="Blank"
        tools:layout="@layout/fragment_blank" />

    <fragment
        android:id="@+id/blankFragment2"
        android:name="com.example.cashdog.cashdog.BlankFragment2"
        android:label="Blank"
        tools:layout="@layout/fragment_blank_2" />
</navigation>
Run Code Online (Sandbox Code Playgroud)

ian*_*ake 7

根据AppBarConfiguration 指南,如果您希望“向上”按钮出现在所有目标上,甚至是起始目标上,则应使用AppBarConfiguration采用顶级目标列表的构造函数。通过传递一个空集,每个目的地都会显示向上按钮。

因此你的 ActivityB 应该是:

internal class ActivityB : AppCompatActivity() {

    private var navController : NavController? = null
    private val appBarConfiguration = AppBarConfiguration(emptySet())

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val toolbar = binding.mainToolbar
        navController = supportFragmentManager.findFragmentById(R.id.host_container) as NavHostFragment).navController
        setSupportActionBar(toolbar)
        // You must always use setupActionBarWithNavController
        // when using setSupportActionBar()
        setupActionBarWithNavController(navController, appBarConfiguration)
    }

    override fun onSupportNavigateUp(): Boolean {
        return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
    }
}
Run Code Online (Sandbox Code Playgroud)