Android - привязка данных к свойству расширенного объекта LiveData

В настоящее время я начал использовать библиотеку привязки данных, и в моей модели просмотра у меня есть расширенный объект 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.


person FalloutBoy    schedule 17.03.2018    source источник
comment
В чем конкретная ошибка? Когда вы удаляете выражение видимости, вы все равно получаете ошибку?   -  person George Mount    schedule 19.03.2018
comment
Вы решили проблему?   -  person GoRoS    schedule 06.02.2019


Ответы (1)


Вместо привязки объекта LiveData привяжите свою модель просмотра. Поэтому измените переменную liveata в файле activity_scanner.xml на

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

и в ScannerActivity

binding.setViewModel(mScannerViewModel);

Тогда ваше связывающее выражение станет

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