Android导航组件未显示正确的操作栏标题。

3
我有一个MainActivity
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val toolbar = findViewById<Toolbar>(R.id.toolbar)
        setSupportActionBar(toolbar)
        val navController = findNavController(R.id.nav_host_fragment)

        toolbar.setupWithNavController(navController, AppBarConfiguration(navController.graph))
    }
}

并且导航图

<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/nav_graph_main.xml"
    app:startDestination="@id/AFragment">

    <fragment
        android:id="@+id/AFragment"
        android:name="com.example.actionbartitletest.AFragment"
        android:label="Fragment A"
        tools:layout="@layout/fragment_a" >
        <action
            android:id="@+id/action_AFragment_to_BFragment"
            app:destination="@id/BFragment" />
    </fragment>
    <fragment
        android:id="@+id/BFragment"
        android:name="com.example.actionbartitletest.BFragment"
        android:label="Fragment B"
        tools:layout="@layout/fragment_b" />
</navigation>

还有 Manifest.xml

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

And strings.xml

<resources>
    <string name="app_name">ActionBarTitleTest</string>
    <!-- TODO: Remove or change this placeholder text -->
    <string name="hello_blank_fragment">Hello blank fragment</string>
</resources>

当应用程序启动时,操作栏标题为ActionBarTitleTest(假设是Manifest.xml中定义的application android:label),然而我期望操作栏标题应该是Fragment A,因为这是在导航图的android:label属性中定义的。当我从AFragment导航到BFragment时,BFragment上的操作栏标题如预期的一样显示为Fragment B,当从BFragment导航回AFragment时,操作栏标题则如预期的显示为Fragment A
为什么应用程序启动时操作栏标题会被设置为application android:label,而不是在nav graph中定义的android:label?我意识到我可以在片段中调用requireActivity().setTitle()来在运行时管理此问题,但我觉得使用导航图中的android:label应该已经足够了。
图片:第一张图片是应用程序启动时的AFragment,第二张图片是导航到BFragment,第三张图片是从BFragment返回到AFragment。
1个回答

3
你正在使用setSupportActionBar(toolbar)方法。
在这种情况下,你应该使用以下方式向默认的操作栏添加导航支持:
setupActionBarWithNavController(navController, AppBarConfiguration(navController.graph))

替代

toolbar.setupWithNavController(navController, AppBarConfiguration(navController.graph))

类似这样的内容

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val toolbar = findViewById<Toolbar>(R.id.toolbar)
    setSupportActionBar(toolbar)

    val navController = findNavController(R.id.nav_host_fragment)
    setupActionBarWithNavController(navController, AppBarConfiguration(navController.graph))
}

不要忘记按照文档中的建议重写onSupportNavigateUp()方法:

override fun onSupportNavigateUp(): Boolean {
    val navController = findNavController(R.id.nav_host_fragment)
    return navController.navigateUp(appBarConfiguration)
            || super.onSupportNavigateUp()
}

1
就是这样,我没有覆盖 onSupportNavigateUp()。一旦我做到了,现在一切都按预期工作了,感谢您的帮助! - Johnas Nellen
我将我的应用程序放到后台并更改设备的语言,然后返回到我的仍在运行的应用程序。由于配置更改,系统会重新创建我的片段。所有标签都进行了翻译,除了应用栏标题。有什么想法吗?也许是个 bug? - Tobi
我的工具栏后退按钮因此停止工作了。 - Nouman Ch
@NoumanCh 你是否按照文档中所述重写了 onSupportNavigateUp() 方法? - Gabriele Mariotti
不,我正在为工具栏使用委托,因此覆盖onSupportNavigateUp对我来说看起来并不好。相反,我在我的委托中同时使用了setupActionBarWithNavController和toolbar.setupWithNavController,它们都可以正常工作。 - Nouman Ch
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接