【发布时间】:2020-08-14 21:22:51
【问题描述】:
使用 Android Jetpack 组件和 MVVM 架构,我们可以通过两种方式从 View Model 获取 View 中的实时数据更新,一种是将布局与实时数据变量绑定,另一种方法是在代码中观察变量。 为了说明我的问题,我举了一个例子。假设有一个视图模型接口 getTimeString() 返回当前时间。
a) 布局数据绑定
-
布局中的视图看起来像这样
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" ... app:binder_data_date="@{sampleVM.timeString}"/> -
绑定适配器看起来像这样
@BindingAdapter("binder_data_date") public static void binder_data_date(TextView text, String data) { text.setText(data); }
b) 手动数据绑定(只是给它一个名字): 在手动数据绑定中,布局视图中没有与活页夹相关的任何内容,我使用 observe() 观察实时数据并更新 textview。
FragmentSplashScreenManualBindingBinding fragmentSplashScreenBinding;
SampleViewModel sampleViewModel1 = ViewModelProviders.of(this).get(SampleViewModel.class);
public void onSomeRandomFunc(...) {
....
sampleViewModel1.getTimeString().observe(getViewLifecycleOwner(), data -> {
fragmentSplashScreenBinding.sampleText.setText(data);
});
}
我知道第一种方法更容易使用,而且两种方法都有效。
- 但是使用第二种方法和访问fragment中的变量(fragmentSplashScreenBinding.sampleText.setText())的方式来更新View是否正确?
- 如果我使用第二种方法,性能会受到影响吗?
【问题讨论】:
标签: android android-layout android-fragments android-jetpack android-mvvm