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
相关产品推荐
相关产品推荐

