美文网首页
(三、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);
        }
    }
    

    相关文章

      网友评论

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

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