Har*_*nan 3 android android-databinding android-livedata android-viewmodel android-architecture-components
我有一个活动,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>
Run Code Online (Sandbox Code Playgroud)
如您所见,该pageTitle属性绑定到 xmlCollapsingToolbarLayout 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"
}
}
Run Code Online (Sandbox Code Playgroud)
并在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)
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,页面标题设置正确。但是,当我在 Activity 并创建第一个子片段之后的任何时间尝试设置标题时,麻烦就开始了(我正在使用NavHostFragment,因此在创建活动后立即创建并附加第一个片段)。我唯一可以更改标题的地方是启动片段的onCreate活动和onCreate生命周期方法。我使用视图模型作为共享视图模型来更改所有子片段的标题。我使用以下方法获取 Fragments 中的 ViewModel:
ViewModelProviders.of(activity!!).get(HomeActivityViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
之后,每当我尝试更改标题时,简单的不会更改。无论是点击按钮,延迟后,在下一个片段上,都没有任何效果。唯一的工作地点是onCreateActivity 直到onCreateView第一个片段。我为pageTitlein添加了一个观察者HomeActivity,但是在第一次更改之后,甚至没有触发观察者。在调试时,我可以看到它是检索到的视图模型的同一个实例,并且pageTitle实际上正在更改,但它只是在创建后停止观察。知道这里有什么问题吗?请帮忙。
LiveData不能使用,DataBinding因为它没有生命周期。
后
binding.viewModel = homeViewModel
Run Code Online (Sandbox Code Playgroud)
尝试添加
binding.lifecycleOwner = this
Run Code Online (Sandbox Code Playgroud)
所以,大家一起
binding.viewModel = homeViewModel
binding.lifecycleOwner = this
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1642 次 |
| 最近记录: |