کتابخانه AndroidX شامل اجزای معماری است که می توانید از آنها برای طراحی برنامه های قوی، قابل آزمایش و قابل نگهداری استفاده کنید. کتابخانه Data Binding به طور یکپارچه با اجزای معماری کار می کند تا توسعه UI شما را ساده تر کند. طرحبندیهای موجود در برنامه شما میتوانند به دادههای موجود در اجزای معماری متصل شوند، که به شما کمک میکند چرخه حیات کنترلکننده رابط کاربری را مدیریت کنید و به UI در مورد تغییرات دادهها اطلاع دهید.
این صفحه نشان می دهد که چگونه اجزای معماری را در برنامه خود بگنجانید تا از استفاده از کتابخانه Data Binding بیشترین بهره را ببرید.
می توانید از اشیاء LiveData
به عنوان منبع اتصال داده استفاده کنید تا به طور خودکار تغییرات در داده ها را به UI اطلاع دهید. برای اطلاعات بیشتر در مورد این مؤلفه معماری، به نمای کلی LiveData مراجعه کنید.
بر خلاف اشیایی که Observable
را پیادهسازی میکنند - مانند فیلدهای قابل مشاهده - اشیاء LiveData
از چرخه زندگی ناظران مشترک در تغییرات داده مطلع هستند. این دانش مزایای بسیاری را ممکن میسازد، که در مزیتهای استفاده از LiveData توضیح داده شده است. در Android Studio نسخه 3.1 و بالاتر، می توانید فیلدهای قابل مشاهده را با اشیاء LiveData
در کد اتصال داده خود جایگزین کنید.
برای استفاده از یک شی LiveData
با کلاس binding خود، باید یک مالک چرخه حیات را برای تعریف محدوده شی LiveData
مشخص کنید. مثال زیر فعالیت را به عنوان مالک چرخه حیات پس از نمونه سازی کلاس binding مشخص می کند:
class ViewModelActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // Inflate view and obtain an instance of the binding class. val binding: UserBinding = DataBindingUtil.setContentView(this, R.layout.user) // Specify the current activity as the lifecycle owner. binding.setLifecycleOwner(this) } }
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
، میتوانید از شی LiveData
برای تبدیل دادهها یا ادغام چندین منبع داده استفاده کنید. مثال زیر نحوه تبدیل داده ها در ViewModel
را نشان می دهد:
class ScheduleViewModel : ViewModel() { val userName: LiveDatainit { val result = Repository.userName userName = Transformations.map(result) { result -> result.value } } }
class ScheduleViewModel extends ViewModel { LiveDatausername; public ScheduleViewModel() { String result = Repository.userName; userName = Transformations.map(result, result -> result.value); } }
کتابخانه Data Binding یکپارچه با اجزای ViewModel
کار می کند. ViewModel
داده هایی را که چیدمان مشاهده می کند در معرض نمایش می گذارد و به تغییرات آن واکنش نشان می دهد. استفاده از مؤلفههای ViewModel
با کتابخانه Data Binding به شما امکان میدهد منطق UI را از طرحبندیها خارج کرده و به مؤلفهها منتقل کنید، که آزمایش آنها آسانتر است. کتابخانه Data Binding تضمین میکند که نماها در صورت نیاز از منبع دادهها محدود و بدون محدودیت هستند. بیشتر کارهای باقیمانده شامل اطمینان از افشای داده های صحیح است. برای اطلاعات بیشتر در مورد این مؤلفه معماری، نمای کلی ViewModel را ببینید.
برای استفاده از مؤلفه ViewModel
با کتابخانه Data Binding، باید مؤلفه خود را نمونه سازی کنید - که از کلاس ViewModel
به ارث می رسد، نمونه ای از کلاس binding خود را به دست آورید و مؤلفه ViewModel
خود را به یک ویژگی در کلاس binding اختصاص دهید. مثال زیر نحوه استفاده از کامپوننت را با کتابخانه نشان می دهد:
class ViewModelActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // Obtain the ViewModel component. val userModel: UserModel by viewModels() // Inflate view and obtain an instance of the binding class. val binding: UserBinding = DataBindingUtil.setContentView(this, R.layout.user) // Assign the component to a property in the binding class. binding.viewmodel = userModel } }
class ViewModelActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { // Obtain the ViewModel component. UserModel userModel = new ViewModelProvider(this).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
خود را با استفاده از عبارات binding به نماهای مربوطه اختصاص دهید:
<CheckBox
android:id="@+id/rememberMeCheckBox"
android:checked="@{viewmodel.rememberMe}"
android: class="devsite-syntax-w"> -> viewmodel.rememberMeChanged()}" />
میتوانید از یک مؤلفه ViewModel
استفاده کنید که رابط Observable
را پیادهسازی میکند تا سایر مؤلفههای برنامه را در مورد تغییرات دادهها مطلع کند، مشابه نحوه استفاده از یک شی LiveData
.
موقعیتهایی وجود دارد که ممکن است ترجیح دهید از یک مؤلفه ViewModel
استفاده کنید که رابط Observable
را نسبت به استفاده از اشیاء LiveData
پیادهسازی میکند، حتی اگر قابلیتهای مدیریت چرخه حیات LiveData
را از دست بدهید. استفاده از کامپوننت ViewModel
که Observable
را پیادهسازی میکند به شما کنترل بیشتری بر روی آداپتورهای اتصال در برنامهتان میدهد. به عنوان مثال، این الگو به شما کنترل بیشتری بر روی اعلان ها در هنگام تغییر داده ها می دهد. همچنین به شما امکان می دهد یک روش سفارشی برای تنظیم مقدار یک ویژگی در اتصال داده دو طرفه مشخص کنید.
برای پیاده سازی یک جزء ViewModel
قابل مشاهده، باید کلاسی ایجاد کنید که از کلاس ViewModel
به ارث برده و رابط Observable
را پیاده سازی کند. زمانی که یک ناظر با استفاده از متدهای addOnPropertyChangedCallback()
و removeOnPropertyChangedCallback()
در اعلانها اشتراک یا لغو اشتراک میکند، میتوانید منطق سفارشی ارائه کنید. همچنین میتوانید منطق سفارشی ارائه کنید که با تغییر ویژگیها در متد notifyPropertyChanged()
اجرا شود. مثال کد زیر نحوه پیاده سازی ViewModel
قابل مشاهده را نشان می دهد:
/** * A ViewModel that is also an Observable, * to be used with the Data Binding Library. */ open class ObservableViewModel : ViewModel(), Observable { private val callbacks: PropertyChangeRegistry = PropertyChangeRegistry() override fun addOnPropertyChangedCallback( callback: Observable.OnPropertyChangedCallback) { callbacks.add(callback) } override fun removeOnPropertyChangedCallback( callback: Observable.OnPropertyChangedCallback) { callbacks.remove(callback) } /** * Notifies observers that all properties of this instance have changed. */ fun notifyChange() { callbacks.notifyCallbacks(this, 0, null) } /** * Notifies observers that a specific property has changed. The getter for the * property that changes must 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. */ fun notifyPropertyChanged(fieldId: Int) { callbacks.notifyCallbacks(this, fieldId, null) } }
/** * 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 must 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); } }
برای کسب اطلاعات بیشتر در مورد اتصال داده ها، به منابع اضافی زیر مراجعه کنید.
- توجه: وقتی جاوا اسکریپت خاموش است، متن پیوند نمایش داده می شود
- با اشیاء داده قابل مشاهده کار کنید
- بارگیری و نمایش داده های صفحه بندی شده
- از کوروتین های کاتلین با اجزای آگاه از چرخه حیات استفاده کنید