【问题标题】:Android - data binding on a property of an LiveData extended objectAndroid - LiveData 扩展对象的属性上的数据绑定
【发布时间】:2018-03-17 15:20:14
【问题描述】:

我目前开始使用数据绑定库,并且在我的视图模型中我有一个扩展的 LiveData 对象:

public class ScannerViewModel extends AndroidViewModel {

    /** MutableLiveData containing the scanner state to notify MainActivity. */
    public ScannerLiveData scannerLiveData;

ScannerLiveData:

public class ScannerLiveData extends MutableLiveData<ScannerLiveData> {
    public boolean mScanningStarted;
    public boolean mBluetoothEnabled;
    public boolean mLocationEnabled;

    public ScannerLiveData(final boolean bluetoothEnabled, final boolean locationEnabled) {
        mScanningStarted = false;
        mBluetoothEnabled = bluetoothEnabled;
        mLocationEnabled = locationEnabled;
        postValue(this);
    }
    ...
}

activity_scanner.xml:

<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_test">

    <data>
        <import type="android.view.View" />

        <variable
            name="livedata"
            type="de.datacollect.ecount.ui.scanner.ScannerLiveData" />
    </data>
            
    ...
    <android.support.constraint.ConstraintLayout
        <ProgressBar
            android:id="@+id/state_scanning"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="-7dp"
            android:layout_marginTop="-8dp"
            android:indeterminate="true"
            android:indeterminateTint="@android:color/white"
            android:visibility="@{livedata.mBluetoothEnabled ? View.VISIBLE : View.INVISIBLE}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/recycler_view_ble_devices" />
        ...

ScannerActivity:

@Override
protected void onCreate(@Nullable final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ActivityScannerBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_scanner);

    // Create view model containing utility methods for scanning
    mScannerViewModel = ViewModelProviders.of(this).get(ScannerViewModel.class);
    mScannerViewModel.getScannerState().observe(this, this::startScan);
    
    binding.setLifecycleOwner(this);
    binding.setLivedata(mScannerViewModel.scannerLiveData);
    ...

如何绑定到mBluetoothEnabled 属性?我在构建时收到未分类的错误。我已经使用了搜索,但没有找到有关它的内容。我们将不胜感激。

顺便说一句:

数据绑定更新:

您现在可以将 LiveData 对象用作数据绑定表达式中的可观察字段。 ViewDataBinding 类现在包含一个新的 setLifecycle 方法,您需要使用它来观察 LiveData 对象。

【问题讨论】:

  • 具体错误是什么?移除可见性表达式后,是否还会报错?
  • 问题解决了吗?

标签: android android-databinding android-livedata


【解决方案1】:

而不是绑定 LiveData 对象绑定您的视图模型。所以将activity_scanner.xml中的livedata变量改为

<variable
     name="viewModel"
     type="de.datacollect.ecount.ui.scanner.ScannerViewModel" />

在 ScannerActivity 中

binding.setViewModel(mScannerViewModel);

那么你的绑定表达式就会变成

android:visibility="@{viewModel.scannerLiveData.mBluetoothEnabled ? View.VISIBLE : View.INVISIBLE}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多