美文网首页
Jetpack学习5—将布局视图绑定到体系结构组件

Jetpack学习5—将布局视图绑定到体系结构组件

作者: 雪晨杰 | 来源:发表于2019-03-12 09:52 被阅读0次

[TOC]

Jetpack学习5—将布局视图绑定到体系结构组件

AndroidX库包含架构组件,您可以使用它来设计健壮,可测试和可维护的应用程序。数据绑定库可与架构组件无缝协作,进一步简化UI的开发。应用程序中的布局可以绑定到体系结构组件中的数据,这些数据已经帮助您管理UI控制器生命周期并通知数据中的更改。

本页面展示如何将架构组件合并到应用程序中,以进一步增强使用数据绑定库的好处。

使用LiveData将数据更改通知UI

您可以使用LiveData对象作为数据绑定源来自动通知UI有关数据更改的信息。有关此体系结构组件的更多信息,请参阅LiveData概述

不同于对象实现Observable--如observable fields--LiveData对象了解订阅数据更改的观察者的生命周期。这种技术带来了许多好处,这些都在使用LiveData的优势中进行了解释。在Android Studio 3.1及更高版本中,在数据绑定中的代码可以使用LiveData对象替换observable fields

要将LiveData对象与绑定类一起使用,需要指定生命周期所有者以定义LiveData对象的范围。以下示例在实例化绑定类之后将activity指定为生命周期所有者:

class ViewModelActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Inflate view and obtain an instance of the binding class.
        UserBinding binding = DataBindingUtil.setContentView(this, R.layout.user);

        // Specify the current activity as the lifecycle owner.
        binding.setLifecycleOwner(this);
    }
}

您可以使用ViewModel组件(如使用ViewModel管理ui相关数据中所述)将数据绑定到布局。在ViewModel组件中,可以使用LiveData对象转换数据或合并多个数据源。下面的例子展示了如何转换视图模型中的数据:

class ScheduleViewModel extends ViewModel {
    LiveData username;

    public ScheduleViewModel() {
        String result = Repository.userName;
        userName = Transformations.map(result, result -> result.value);
    }
}

使用ViewModel管理ui相关的数据

数据绑定库与ViewModel组件无缝协作,组件公开视图观察的数据,并对其更改作出反应。

通过一起使用 ViewModel组件和数据绑定库,您可以将UI逻辑从布局移动到组件中,这些组件更易于测试。数据绑定库确保视图在需要时从数据源绑定和解除绑定。剩下的大部分工作是确保您公开了正确的数据。有关此体系结构组件的更多信息,请参阅ViewModel概述

要将ViewModel组件与数据绑定库一起使用,必须实例化从Viewmodel类继承的组件,获取绑定类的实例,并将ViewModel组件分配给绑定类中的属性。以下示例显示如何将该组件与库一起使用:

class ViewModelActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Obtain the ViewModel component.
        UserModel userModel = ViewModelProviders.of(getActivity())
                                                  .get(UserModel.class);

        // Inflate view and obtain an instance of the binding class.
        UserBinding binding = DataBindingUtil.setContentView(this, R.layout.user);

        // Assign the component to a property in the binding class.
        binding.viewmodel = userModel;
    }
}

在您的布局中,使用绑定表达式将ViewModel组件的属性和方法分配给相应的视图,如下面的示例所示:

<CheckBox
    android:id="@+id/rememberMeCheckBox"
    android:checked="@{viewmodel.rememberMe}"
    android:onCheckedChanged="@{() -> viewmodel.rememberMeChanged()}" />

使用Observable ViewModel可以更好地控制绑定适配器

您可以使用实现ObservableViewModel组件来通知其他应用程序组件数据的变化,类似于使用LiveData对象。

在某些情况下,您可能更喜欢使用实现Observable接口的ViewModel组件,而不是使用LiveData对象,即使您失去了LiveData的生命周期管理功能。使用一个实现了ObservableViewModel组件,可以更好地控制应用程序中的绑定适配器。例如,此模式使您可以在数据更改时更好地控制通知,它还允许您指定一个自定义的方法来设置一个属性的值在双向数据绑定。

/**
 * A ViewModel that is also an Observable,
 * to be used with the Data Binding Library.
 */
class ObservableViewModel extends ViewModel implements Observable {
    private PropertyChangeRegistry callbacks = new PropertyChangeRegistry();

    @Override
    protected void addOnPropertyChangedCallback(
            Observable.OnPropertyChangedCallback callback) {
        callbacks.add(callback);
    }

    @Override
    protected void removeOnPropertyChangedCallback(
            Observable.OnPropertyChangedCallback callback) {
        callbacks.remove(callback);
    }

    /**
     * 通知观察者此实例的所有属性都已更改。
     */
    void notifyChange() {
        callbacks.notifyCallbacks(this, 0, null);
    }

    /**
     * 通知观察者一个特定的属性发生了变化。属性的getter应该使用@Bindable注解标记用来在BR类     * 中生成一个字段用作fieldId参数
     *
     * @param fieldId为Bindable字段生成的BR ID。
     */
    void notifyPropertyChanged(int fieldId) {
        callbacks.notifyCallbacks(this, fieldId, null);
    }
}

相关文章

网友评论

      本文标题:Jetpack学习5—将布局视图绑定到体系结构组件

      本文链接:https://www.haomeiwen.com/subject/jxfgpqtx.html