Düzen görünümlerini Mimari Bileşenlere bağlama

AndroidX kitaplığı; sağlam, test edilebilir ve bakımı yapılabilir uygulamalar tasarlamak için kullanabileceğiniz Mimari Bileşenleri'ni içerir. Veri Bağlama Kitaplığı, kullanıcı arayüzünüzün geliştirme sürecini daha da basitleştirmek için Mimari Bileşenleri ile sorunsuz bir şekilde çalışır. Uygulamanızdaki düzenler, Mimari Bileşenleri'ndeki verilere bağlanabilir. Bu, kullanıcı arayüzü denetleyicisinin yaşam döngüsünü yönetmenize ve verilerdeki değişiklikleri kullanıcı arayüzüne bildirmenize yardımcı olur.

Bu sayfada, Veri Bağlama Kitaplığı'ndan en iyi şekilde yararlanmak için Mimari Bileşenleri'ni uygulamanıza nasıl dahil edeceğiniz gösterilmektedir.

Kullanıcı arayüzüne veri değişiklikleri hakkında bildirimde bulunmak için LiveData'yı kullanma

Verilerdeki değişiklikler hakkında kullanıcı arayüzüne otomatik olarak bildirimde bulunmak için veri bağlama kaynağı olarak LiveData nesnelerini kullanabilirsiniz. Bu Mimari Bileşeni hakkında daha fazla bilgi için LiveData'ya genel bakış bölümüne bakın.

Observable özelliğini uygulayan nesnelerin (ör. gözlemlenebilir alanlar) aksine LiveData nesneler, veri değişikliklerine abone olan gözlemcilerin yaşam döngüsünü bilir. Bu bilgi, LiveData kullanmanın avantajları bölümünde açıklanan birçok avantaj sağlar. Android Studio 3.1 ve sonraki sürümlerde, veri bağlama kodunuzdaki gözlemlenebilir alanları LiveData nesneleriyle değiştirebilirsiniz.

Bağlama sınıfınızla bir LiveData nesnesi kullanmak için LiveData nesnesinin kapsamını tanımlamak üzere bir yaşam döngüsü sahibi belirtmeniz gerekir. Aşağıdaki örnek, bağlama sınıfı örneklendikten sonra yaşam döngüsü sahibi olarak etkinliği belirtir:

Kotlin

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)
    }
}

Java

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

Verileri düzene bağlamak için aşağıdaki bölümde açıklandığı gibi bir ViewModel bileşeni kullanabilirsiniz. ViewModel bileşeninde, verileri dönüştürmek veya birden fazla veri kaynağını birleştirmek için LiveData nesnesini kullanabilirsiniz. Aşağıdaki örnekte, ViewModel içindeki verilerin nasıl dönüştürüleceği gösterilmektedir:

Kotlin

class ScheduleViewModel : ViewModel() {
    val userName: LiveData

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

Java

class ScheduleViewModel extends ViewModel {
    LiveData username;

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

Kullanıcı arayüzü ile ilgili verileri yönetmek için ViewModel'i kullanma

Veri Bağlama Kitaplığı ViewModel bileşenleriyle sorunsuz bir şekilde çalışır. ViewModel, düzenin gözlemlediği ve değişikliklerine tepki verdiği verileri gösterir. Veri Bağlama Kitaplığı ile ViewModel bileşenlerini kullanmak, kullanıcı arayüzü mantığını düzenlerin dışına ve test edilmesi daha kolay olan bileşenlere taşımanıza olanak tanır. Veri Bağlama Kitaplığı, gerektiğinde görünümlerin veri kaynağına bağlanmasını ve bağlantısının kaldırılmasını sağlar. Geriye kalan işin büyük kısmı doğru verileri ortaya koyduğunuzdan Bu Mimari Bileşeni hakkında daha fazla bilgi için ViewModel'e genel bakış bölümüne bakın.

ViewModel bileşenini Veri Bağlama Kitaplığı ile kullanmak için bileşeninizi (ViewModel sınıfından devralır) başlatmanız, bağlama sınıfınızın bir örneğini edinmeniz ve ViewModel bileşeninizi bağlama sınıfındaki bir mülke atamanız gerekir. Aşağıdaki örnekte, bileşenin kitaplıkla nasıl kullanılacağı gösterilmektedir:

Kotlin

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
    }
}

Java

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;
    }
}

Aşağıdaki örnekte gösterildiği gibi, düzeninizde ViewModel bileşeninizin özelliklerini ve yöntemlerini, bağlama ifadeleri kullanarak karşılık gelen görünümlere atayın:

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

Bağlama bağdaştırıcıları üzerinde daha fazla kontrol sahibi olmak için Gözlemlenebilir ViewModel kullanın

LiveData nesnesini kullanmaya benzer şekilde, diğer uygulama bileşenlerine verilerdeki değişiklikleri bildirmek için Observable arayüzünü uygulayan bir ViewModel bileşeni kullanabilirsiniz.

LiveData nesnelerinin yaşam döngüsü yönetim özelliklerini kaybetseniz bile LiveData nesnelerini kullanmak yerine Observable arayüzünü uygulayan bir ViewModel bileşenini kullanmayı tercih edebileceğiniz durumlar vardır. Observable uygulayan bir ViewModel bileşeni kullanmak, uygulamanızdaki bağlama bağdaştırıcıları üzerinde daha fazla kontrol sahibi olmanızı sağlar. Örneğin, bu kalıp, veri değiştiğinde bildirimler üzerinde daha fazla kontrol sahibi olmanızı sağlar. Ayrıca, iki yönlü veri bağlamada bir özelliğin değerini ayarlamak için özel bir yöntem belirtmenize de olanak tanır.

Gözlemlenebilir ViewModel bileşenini uygulamak için ViewModel sınıfından devralan ve Observable arayüzünü uygulayan bir sınıf oluşturmanız gerekir. Bir gözlemci, addOnPropertyChangedCallback() ve removeOnPropertyChangedCallback() yöntemlerini kullanarak bildirimlere abone olduğunda veya bildirimlere olan abonelikten çıktığında özel mantık sağlayabilirsiniz. notifyPropertyChanged() yönteminde özellikler değiştiğinde çalışan özel bir mantık da sağlayabilirsiniz. Aşağıdaki kod örneğinde gözlemlenebilir bir ViewModel öğesinin nasıl uygulanacağı gösterilmektedir:

Kotlin

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

Java

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

Ek kaynaklar

Veri bağlama hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.