美文网首页
(三、7)将布局视图绑定到体系结构组件

(三、7)将布局视图绑定到体系结构组件

作者: 鹿小纯0831 | 来源:发表于2018-10-22 11:18 被阅读14次

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

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

一、使用LiveData通知UI有关数据更改的信息

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

与实现Observable的对象(例如可观察字段)不同,LiveData对象了解订阅数据更改的观察者的生命周期。 这些知识带来了许多好处,使用LiveData的优势对此进行了解释。 在Android Studio 3.1及更高版本中,您可以使用数据绑定代码中的LiveData对象替换可观察字段。

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

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对象转换数据或合并多个数据源。 以下示例显示如何转换ViewModel中的数据:

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可以更好地控制绑定适配器

您可以使用实现Observable的ViewModel组件来通知其他应用程序组件有关数据更改的信息,类似于使用LiveData对象的方式。

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

要实现可观察的ViewModel组件,必须创建一个继承自ViewModel类并实现Observable接口的类。当观察者使用addOnPropertyChangedCallback()和removeOnPropertyChangedCallback()方法订阅或取消订阅通知时,您可以提供自定义逻辑。您还可以提供在notifyPropertyChanged()方法中属性更改时运行的自定义逻辑。以下代码示例演示如何实现可观察的ViewModel:

/**
 * 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);
    }

    /**
     * Notifies observers that all properties of this instance have changed.
     */
    void notifyChange() {
        callbacks.notifyCallbacks(this, 0, null);
    }

    /**
     * Notifies observers that a specific property has changed. The getter for the
     * property that changes should be marked with the @Bindable annotation to
     * generate a field in the BR class to be used as the fieldId parameter.
     *
     * @param fieldId The generated BR id for the Bindable field.
     */
    void notifyPropertyChanged(int fieldId) {
        callbacks.notifyCallbacks(this, fieldId, null);
    }
}

相关文章

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

    [TOC] Jetpack学习5—将布局视图绑定到体系结构组件 AndroidX库包含架构组件,您可以使用它来设计...

  • (三、7)将布局视图绑定到体系结构组件

    AndroidX库包含架构组件,您可以使用它来设计健壮,可测试和可维护的应用程序。 数据绑定库可与架构组件无缝协作...

  • (三、5)生成的绑定类

    数据绑定库生成用于访问布局的变量和视图的绑定类。 此页面显示如何创建和自定义生成的绑定类。生成的绑定类将布局变量与...

  • 数据绑定库

    数据绑定库是一个支持库,允许您使用声明性格式而不是以编程方式将布局中的UI组件绑定到应用程序中的数据源。 布局通常...

  • Android Jetpack: DataBinding | 数

    数据绑定库是一个支持库,允许您使用声明性格式而不是以编程方式将布局中的UI组件绑定到应用程序中的数据源。 布局通常...

  • Flutter Stack 的布局规则

    Stack 布局 Stack 是可以将视图根据children中子组件的顺序进行叠加的组件,根据子组件是否被Pos...

  • (三、3)布局和绑定表达式

    表达式语言允许您编写处理视图调度的事件的表达式。 数据绑定库自动生成将布局中的视图与数据对象绑定所需的类。 数据绑...

  • Jetpack系列(二、架构)

    一、数据绑定库 数据绑定库是一种支持库,可以使用声明格式将布局中的界面组件绑定在应用的数据源。布局通常使用该框架方...

  • 数据的绑定 --- 双向绑定

    数据双向绑定 : 视图的数据可以绑定到模型当中,模型的数据可以绑定到视图当中 想要实现视图的数据绑定到模型当中,必...

  • Jetpack DataBinding

    作用 将视图绑定到Activity不再需要findViewById() DataBinding 与 ViewMod...

网友评论

      本文标题:(三、7)将布局视图绑定到体系结构组件

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