نماهای طرح بندی را به اجزای معماری متصل کنید

کتابخانه AndroidX شامل اجزای معماری است که می توانید از آنها برای طراحی برنامه های قوی، قابل آزمایش و قابل نگهداری استفاده کنید. کتابخانه Data Binding به طور یکپارچه با اجزای معماری کار می کند تا توسعه UI شما را ساده تر کند. طرح‌بندی‌های موجود در برنامه شما می‌توانند به داده‌های موجود در اجزای معماری متصل شوند، که به شما کمک می‌کند چرخه حیات کنترل‌کننده رابط کاربری را مدیریت کنید و به UI در مورد تغییرات داده‌ها اطلاع دهید.

این صفحه نشان می دهد که چگونه اجزای معماری را در برنامه خود بگنجانید تا از استفاده از کتابخانه Data Binding بیشترین بهره را ببرید.

از LiveData برای اطلاع دادن به UI در مورد تغییرات داده استفاده کنید

می توانید از اشیاء 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: LiveData

    init {
        val result = Repository.userName
        userName = Transformations.map(result) { result -> result.value }
    }
}

جاوا

class ScheduleViewModel extends ViewModel {
    LiveData username;

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

از ViewModel برای مدیریت داده های مربوط به رابط کاربری استفاده کنید

کتابخانه 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:onCheckedChanged="@{() -> viewmodel.rememberMeChanged()}" />

برای کنترل بیشتر بر روی آداپتورهای اتصال از یک ViewModel قابل مشاهده استفاده کنید

می‌توانید از یک مؤلفه 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);
    }
}

منابع اضافی

برای کسب اطلاعات بیشتر در مورد اتصال داده ها، به منابع اضافی زیر مراجعه کنید.

{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% آخر کلمه %}