You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何从Fragment修改MaterialToolbar标题?

问题描述

我已经实现了MaterialToolbar,希望根据当前活跃的Fragment修改其标题及按钮功能,但尝试两天仍无法从Fragment中访问Toolbar,以下两种方式均无效:

  • activity?.actionBar?.title
  • (activity as AppCompatActivity).supportActionBar?.title

相关代码

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
    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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".view.MainActivity">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.google.android.material.appbar.MaterialToolbar
            android:id="@+id/materialToolbar"
            style="@style/Widget.MaterialComponents.Toolbar.Primary"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:navigationIcon="@drawable/ic_menu" />

        <fragment
            android:id="@+id/fragmentContainer"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:defaultNavHost="true"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/materialToolbar"
            app:navGraph="@navigation/nav_graph" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    
    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigationView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@color/primary_ultra_light"
        app:headerLayout="@layout/header_menu_drawer"
        app:menu="@menu/menu_drawer" />

</androidx.drawerlayout.widget.DrawerLayout>

MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        setSupportActionBar(binding.materialToolbar)
        supportActionBar?.title = "Test"
    }
}

HomeFragment.kt

class HomeFragment: Fragment() {
    private lateinit var binding: HomeFragmentBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        activity?.actionBar?.title = "Home 1" /* actionBar == null */
         
        /* supportActionBar == null */
        (activity as AppCompatActivity).supportActionBar?.title = "Home 2"
    }
}

不符合预期的运行结果

我的目标是移除Fragment顶部栏(Calculators),统一使用Toolbar(Test),因此需要为每个Fragment适配Toolbar。
运行结果截图


已实现的可行方案

目前我通过ViewModel观察者实现了功能,但不确定该方案是否合理,希望得到确认或改进意见。

ToolbarVM.kt

class ToolbarVM(app: Application) : AndroidViewModel(app) {
    
    private val _title = MutableLiveData<String>()
    var title: LiveData<String> = _title
    
    fun setTitle(newTitle: String){
        _title.value = newTitle
    }
}

修改后的MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private val toolbarVm: ToolbarVM by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        setSupportActionBar(binding.materialToolbar)

        val titleObserver = Observer<String> { newTitle ->
            binding.materialToolbar.title = newTitle
        }

        toolbarVm.title.observe(this, titleObserver)
    }
}

修改后的HomeFragment.kt

/*需要实例化ToolbarVm并调用setTitle()方法*/
private lateinit var toolbarVm: ToolbarVM
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        toolbarVm = activity?.let { ViewModelProvider(it)[ToolbarVM::class.java] }!!
    }

// 在需要的地方调用该方法
toolbarVm.setTitle("Calculators")

内容的提问来源于stack exchange,提问作者AlexV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:35:16