У меня есть активность с CoordinatorLayout
, которая содержит CollapsingToolbarLayout
.Я привязал заголовок действия к свойству title
CollapsingToolbarLayout
, как показано ниже (размещение только соответствующих частей кода, поскольку макет слишком большой):
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable name="viewModel"
type="com.android.myapp.ui.activity.home.HomeActivityViewModel"/>
</data>
<RelativeLayout 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">
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="com.android.myapp.ui.behavior.scroll.appbar.DisableableAppBarLayoutBehavior"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:title="@{viewModel.pageTitle}"
app:collapsedTitleTextAppearance="@style/CollapsedAppBarTitleStyle"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleGravity="bottom|center_horizontal"
app:expandedTitleMarginBottom="85dp"
app:expandedTitleTextAppearance="@style/ExpandedAppBarTitleStyle"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<!--Remaining layout-->
</layout>
Как вы можете видетьсвойство pageTitle
привязано к свойству xml CollapsingToolbarLayout
title
.
Теперь в HomeActivityViewModel
:
class HomeActivityViewModel(application: Application) : AndroidViewModel(application) {
var isToolbarExpandable = MutableLiveData<Boolean>() // For handling the expansion of toolbar on navigation. This works perfectly
var pageTitle = MutableLiveData<String>()
init {
isToolbarExpandable.value = true
pageTitle.value = "Home"
}
}
И в HomeActivity
:
class HomeActivity : AppCompatActivity() {
private lateinit var homeViewModel: HomeActivityViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivitySafaricomHomeBinding>(this, R.layout.activity_safaricom_home)
binding.lifecycleOwner = this
setSupportActionBar(toolbar)
homeViewModel = getHomeViewModel()
binding.viewModel = homeViewModel
}
private fun getHomeViewModel(): HomeActivityViewModel = ViewModelProviders.of(this).get(HomeActivityViewModel::class.java)
}
В этом случае заголовок страницы установлен правильно.Но проблема начинается, когда я пытаюсь установить заголовок в любое время после того, как действие и первый дочерний фрагмент создан (я использую NavHostFragment
, поэтому первый фрагмент создается и присоединяется, как только действие создается).Единственное место, где я могу изменить заголовок, - это onCreate
активность и onCreate
методы жизненного цикла начального фрагмента.Я использую модель представления в качестве общей модели представления, чтобы изменить заголовок из всех дочерних фрагментов.Я получаю ViewModel во фрагментах, используя:
ViewModelProviders.of(activity!!).get(HomeActivityViewModel::class.java)
После этого, всякий раз, когда я пытаюсь изменить заголовок, он просто не изменится.Будь то нажатие кнопки, после задержки, на следующем фрагменте, ничего не работает.Единственное рабочее место - onCreate
Активности до onCreateView
первого фрагмента.Я добавил наблюдателя для pageTitle
в HomeActivity
, но после первого изменения даже наблюдатель не запускается.При отладке я мог видеть, что это тот же самый экземпляр модели представления, который извлекается, и pageTitle
фактически изменяется, но он просто перестает наблюдать после создания.Есть идеи, в чем здесь проблема?Пожалуйста, помогите.