android - ViewModel 中的 ObservableField 值不会使用数据绑定(bind)更新 UI

标签 android android-databinding android-mvvm

ObservableField<Marker>里面的值 ViewModel使用 EditText 更改类值在布局中,但是值不会传播到 TextView tv_summary .

这是布局

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <import type="com.example.tutorial5livedata_mvvm_room_recyclerview.util.BindingUtils"/>
        <variable
            name="viewModel"
            type="com.example.tutorial5livedata_mvvm_room_recyclerview.viewmodel.AddMarkerViewModel"/>

    </data>

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">


        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:text="Title"
            android:textColor="#FC7100"
            android:textSize="18sp"
            android:textStyle="bold"
            app:layout_constraintStart_toStartOf="@+id/guideline_left"
            app:layout_constraintTop_toTopOf="parent" />

        <EditText
            android:id="@+id/et_title"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            android:layout_marginTop="8dp"
            android:ems="10"
            android:hint="Title"
            android:inputType="textPersonName"
            android:text="@={viewModel.markerObservableField.title}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="@+id/guideline_left"
            app:layout_constraintTop_toBottomOf="@+id/tv_title" />


        <TextView
            android:id="@+id/tv_latitude"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:text="Latitude"
            android:textColor="#FC7100"
            android:textSize="18sp"
            android:textStyle="bold"
            app:layout_constraintStart_toStartOf="@+id/guideline_left"
            app:layout_constraintTop_toBottomOf="@+id/et_title" />

        <EditText
            android:id="@+id/et_latitude"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            android:layout_marginTop="8dp"
            android:ems="10"
            android:hint="Latitude"
            android:text="@={viewModel.markerObservableField.latitude}"
            android:inputType="number"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="@+id/guideline_left"
            app:layout_constraintTop_toBottomOf="@+id/tv_latitude" />



        <TextView
            android:id="@+id/tv_summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:text='@{viewModel.markerObservableField.title + " " + viewModel.markerObservableField.latitude}'
            app:layout_constraintStart_toStartOf="@+id/guideline_left"
            app:layout_constraintTop_toBottomOf="@+id/et_latitude" />


        <android.support.constraint.Guideline
            android:id="@+id/guideline_left"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_begin="8dp" />
    </android.support.constraint.ConstraintLayout>
</layout>

View 模型类

public class AddMarkerViewModel extends AndroidViewModel {

    private MarkerRepository mMarkerRepository;
    public ObservableField<Marker> markerObservableField = new ObservableField<>();


    public AddMarkerViewModel(@NonNull Application application) {
        super(application);

        AppDatabase appDatabase = AppDatabase.getInstance(application.getApplicationContext());

        mMarkerRepository = MarkerRepository
                .getsInstance(MarkerLocalDataSource.getInstance(appDatabase.markerDao(), new AppExecutors()));
        if (markerObservableField.get() == null) {
            Marker marker = new Marker();
            marker.setTitle("New Title");
            markerObservableField.set(marker);
        }
    }


    public long addMarker(Marker marker) {
        return mMarkerRepository.addMarker(marker);
    }
}

Activity的onCreate方法添加标记设置值

   protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_add_marker);
        mAddMarkerViewModel = ViewModelProviders.of(this).get(AddMarkerViewModel.class);
        mBinding.setViewModel(mAddMarkerViewModel);

    }

最佳答案

为了监听属性变化,您需要扩展 BaseObservable

我认为这里的问题是属性更改不会触发事件,因为您监听 Field 更改,即标记对象本身,它保持不变。

Marker 字段 Latitude 不可观察,这意味着无法检测到它的变化。

您有两个选择。

如果您想检测变化,您可以为 Latitude 创建可观察字段。

public ObservableField<String> latitudeObservableField = new ObservableField<>();

您可以监听字段变化并更新标记对象。

 latitudeObservableField.addOnPropertyChangedCallback(() -> {
 // Update marker object
})

另一种方法是使 Marker 扩展 BaseObservable,如所附引用资料中所述。

请查看关于 observable objects 的官方文档.

关于android - ViewModel 中的 ObservableField 值不会使用数据绑定(bind)更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51135367/

相关文章:

android - 部署到 App Engine 问题 - 您必须登录才能执行此操作

android - Robolectric + rxJava + 改造 第二次调用抛出 java.io.InterruptedIOException

android - @BindingAdapter 不适用于 Android Kotlin 库

android - 可以在 ViewModel 中对 Transformations.map() 返回的 Livedata 调用 observeForever() 吗?

安卓架构组件

android - 如何使用 mvvm 模式显示 alertDialog Box

android - android studio 中的错误 Firebase 配置

android - SQLite 中的 sql 查询是什么,从数据库表中检索上周、上个月和去年的记录

安卓数据绑定(bind) : Is there a good way to show/hide an includes tag?

android - 数据绑定(bind)在 fragment 和 Activity 之间表现出意外