উভয়-মুখী ডেটা বাইন্ডিং

একমুখী ডেটা বাইন্ডিং ব্যবহার করে, আপনি কোনও অ্যাট্রিবিউটে ভ্যালু সেট করতে এবং এমন একটি লিসেনার সেট করতে পারেন যা সেই অ্যাট্রিবিউটে পরিবর্তনের ক্ষেত্রে প্রতিক্রিয়া জানায়:

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

টু-ওয়ে ডেটা বাইন্ডিং এই প্রসেসের একটি শর্টকাট প্রদান করে:

<CheckBox
    android:id="@+id/rememberMeCheckBox"
    android:checked="@={viewmodel.rememberMe}"
/>

@={} নোটেশন, যার মধ্যে গুরুত্বপূর্ণভাবে "=" চিহ্ন অন্তর্ভুক্ত থাকে, সেটি প্রপার্টিতে ডেটা পরিবর্তন রিসিভ করে এবং একই সাথে ব্যবহারকারীর আপডেট শোনে।

ব্যাক-আপ ডেটায় হওয়া পরিবর্তনের প্রতিক্রিয়া জানাতে, আপনি নিজের লেআউট ভেরিয়েবলকে Observable-এর একটি ইমপ্লিমেন্টেশন হিসেবে তৈরি করতে পারেন, সাধারণত BaseObservable, এবং একটি @Bindable অ্যানোটেশন ব্যবহার করতে পারেন, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

Kotlin

class LoginViewModel : BaseObservable {
    // val data = ...

    @Bindable
    fun getRememberMe(): Boolean {
        return data.rememberMe
    }

    fun setRememberMe(value: Boolean) {
        // Avoids infinite loops.
        if (data.rememberMe != value) {
            data.rememberMe = value

            // React to the change.
            saveData()

            // Notify observers of a new value.
            notifyPropertyChanged(BR.remember_me)
        }
    }
}

জাভা

public class LoginViewModel extends BaseObservable {
    // private Model data = ...

    @Bindable
    public Boolean getRememberMe() {
        return data.rememberMe;
    }

    public void setRememberMe(Boolean value) {
        // Avoids infinite loops.
        if (data.rememberMe != value) {
            data.rememberMe = value;

            // React to the change.
            saveData();

            // Notify observers of a new value.
            notifyPropertyChanged(BR.remember_me);
        }
    }
}

যেহেতু বাইন্ডেবল প্রপার্টির গেটার পদ্ধতিকে getRememberMe() বলা হয়, তাই প্রপার্টির সংশ্লিষ্ট সেটার পদ্ধতি অটোমেটিক setRememberMe() নামটি ব্যবহার করে।

BaseObservable এবং @Bindable ব্যবহার করার ব্যাপারে আরও তথ্যের জন্য, পর্যবেক্ষণযোগ্য ডেটা অবজেক্টের সাথে কাজ করুন দেখুন।

কাস্টম অ্যাট্রিবিউট ব্যবহার করে টু-ওয়ে ডেটা বাইন্ডিং

প্ল্যাটফর্মটি সবচেয়ে সাধারণ টু-ওয়ে অ্যাট্রিবিউট এবং চেঞ্জ লিসনারের জন্য টু-ওয়ে ডেটা বাইন্ডিং ইমপ্লিমেন্টেশন প্রদান করে, যা আপনি আপনার অ্যাপের অংশ হিসেবে ব্যবহার করতে পারেন। আপনি যদি কাস্টম অ্যাট্রিবিউটের সাথে টু-ওয়ে ডেটা বাইন্ডিং ব্যবহার করতে চান, তাহলে আপনাকে @InverseBindingAdapter এবং @InverseBindingMethod অ্যানোটেশন নিয়ে কাজ করতে হবে।

যেমন, আপনি যদি MyView নামক কাস্টম ভিউতে "time" অ্যাট্রিবিউটে টু-ওয়ে ডেটা বাইন্ডিং চালু করতে চান, তাহলে নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:

  1. @BindingAdapter ব্যবহার করে ভ্যালু পরিবর্তন হলে প্রাথমিক ভ্যালু সেট ও আপডেট করে এমন পদ্ধতি অ্যানোটেট করুন:

    Kotlin

    @BindingAdapter("time")
    @JvmStatic fun setTime(view: MyView, newValue: Time) {
        // Important to break potential infinite loops.
        if (view.time != newValue) {
            view.time = newValue
        }
    }

    জাভা

    @BindingAdapter("time")
    public static void setTime(MyView view, Time newValue) {
        // Important to break potential infinite loops.
        if (view.time != newValue) {
            view.time = newValue;
        }
    }
  2. @InverseBindingAdapter ব্যবহার করে ভিউ থেকে ভ্যালু রিড করে এমন পদ্ধতি অ্যানোটেট করুন:

    Kotlin

    @InverseBindingAdapter("time")
    @JvmStatic fun getTime(view: MyView) : Time {
        return view.getTime()
    }

    জাভা

    @InverseBindingAdapter("time")
    public static Time getTime(MyView view) {
        return view.getTime();
    }

এই পর্যায়ে, ডেটা বাইন্ডিং জানে যে ডেটা পরিবর্তন হলে কী করতে হবে (এটি @BindingAdapter-এর সাথে অ্যানোটেট করা মেথডকে কল করে) এবং ভিউ অ্যাট্রিবিউট পরিবর্তন হলে কী কল করতে হবে (এটি InverseBindingListener-কে কল করে)। তবে, এটি জানে না যে অ্যাট্রিবিউট কখন বা কীভাবে পরিবর্তন হয়।

এর জন্য, আপনাকে ভিউতে লিসেনার সেট করতে হবে। এটি আপনার কাস্টম ভিউয়ের সাথে যুক্ত কাস্টম লিসেনার হতে পারে অথবা এটি কোনও সাধারণ ইভেন্ট হতে পারে, যেমন ফোকাস হারিয়ে যাওয়া বা টেক্সট পরিবর্তন। প্রপার্টিতে পরিবর্তন করার জন্য লিসেনার সেট করে এমন পদ্ধতিতে @BindingAdapter অ্যানোটেশন যোগ করুন:

Kotlin

@BindingAdapter("app:timeAttrChanged")
@JvmStatic fun setListeners(
        view: MyView,
        attrChange: InverseBindingListener
) {
    // Set a listener for click, focus, touch, etc.
}

জাভা

@BindingAdapter("app:timeAttrChanged")
public static void setListeners(
        MyView view, final InverseBindingListener attrChange) {
    // Set a listener for click, focus, touch, etc.
}

লিসনারে প্যারামিটার হিসেবে InverseBindingListener অন্তর্ভুক্ত থাকে। অ্যাট্রিবিউট পরিবর্তন হয়েছে তা ডেটা বাইন্ডিং সিস্টেমকে জানাতে আপনি InverseBindingListener ব্যবহার করেন। তারপর সিস্টেম @InverseBindingAdapter ব্যবহার করে অ্যানোটেট করা পদ্ধতি কল করা শুরু করতে পারে এবং এইভাবে চলতে থাকে।

বাস্তবে, এই লিসেনারে কিছু নন-ট্রিভিয়াল লজিক অন্তর্ভুক্ত থাকে, যার মধ্যে ওয়ান-ওয়ে ডেটা বাইন্ডিংয়ের জন্য লিসেনারও অন্তর্ভুক্ত। উদাহরণস্বরূপ, টেক্সট অ্যাট্রিবিউট পরিবর্তনের জন্য অ্যাডাপ্টার দেখুন, TextViewBindingAdapter।

কনভার্টার

View অবজেক্টের সাথে বাউন্ড করা ভেরিয়েবল দেখানোর আগে ফর্ম্যাট, অনুবাদ বা কোনওভাবে পরিবর্তন করতে হলে, Converter অবজেক্ট ব্যবহার করা যেতে পারে।

যেমন, তারিখ দেখায় এমন একটি EditText অবজেক্ট নিন:

<EditText
    android:id="@+id/birth_date"
    android:text="@={Converter.dateToString(viewmodel.birthDate)}"
/>

viewmodel.birthDate অ্যাট্রিবিউটে Long ধরনের ভ্যালু আছে, তাই এটি কনভার্টার ব্যবহার করে ফর্ম্যাট করতে হবে।

যেহেতু টু-ওয়ে এক্সপ্রেশন ব্যবহার করা হচ্ছে, তাই লাইব্রেরিকে জানানোর জন্য একটি ইনভার্স কনভার্টারও থাকতে হবে, যাতে ব্যবহারকারীর দেওয়া স্ট্রিংকে কীভাবে ব্যাকিং ডেটা টাইপে কনভার্ট করা যায় তা জানা যায়, এই ক্ষেত্রে Long। এই প্রসেসটি সম্পূর্ণ করতে, একটি কনভার্টারে @InverseMethod অ্যানোটেশন যোগ করতে হবে এবং এই অ্যানোটেশনটি ইনভার্স কনভার্টারকে রেফারেন্স করবে। এই কনফিগারেশনের একটি উদাহরণ নিম্নলিখিত কোড স্নিপেটে দেখা যাবে

Kotlin

object Converter {
    @InverseMethod("stringToDate")
    @JvmStatic fun dateToString(
        view: EditText, oldValue: Long,
        value: Long
    ): String {
        // Converts long to String.
    }

    @JvmStatic fun stringToDate(
        view: EditText, oldValue: String,
        value: String
    ): Long {
        // Converts String to long.
    }
}

জাভা

public class Converter {
    @InverseMethod("stringToDate")
    public static String dateToString(EditText view, long oldValue,
            long value) {
        // Converts long to String.
    }

    public static long stringToDate(EditText view, String oldValue,
            String value) {
        // Converts String to long.
    }
}

টু-ওয়ে ডেটা বাইন্ডিং ব্যবহার করে ইনফিনিট লুপ

টু-ওয়ে ডেটা বাইন্ডিং ব্যবহার করার সময় ইনফাইনাইট লুপ যাতে তৈরি না হয় সেই ব্যাপারে সতর্ক থাকুন। ব্যবহারকারী কোনও অ্যাট্রিবিউট পরিবর্তন করলে, @InverseBindingAdapter ব্যবহার করে অ্যানোটেট করা পদ্ধতি কল করা হয় এবং ব্যাকিং প্রপার্টিতে ভ্যালু অ্যাসাইন করা হয়। এটি, পরিবর্তে, @BindingAdapter ব্যবহার করে অ্যানোটেট করা পদ্ধতিকে কল করবে, যা @InverseBindingAdapter ব্যবহার করে অ্যানোটেট করা পদ্ধতিতে আরেকটি কল ট্রিগার করবে, এবং আরও অনেক কিছু।

এই কারণে, @BindingAdapter ব্যবহার করে অ্যানোটেট করা পদ্ধতিতে নতুন ও পুরনো ভ্যালু তুলনা করে সম্ভাব্য ইনফিনিট লুপ ব্রেক করা গুরুত্বপূর্ণ।

টু-ওয়ে অ্যাট্রিবিউট

আপনি নিম্নলিখিত টেবিলের অ্যাট্রিবিউট ব্যবহার করলে, প্ল্যাটফর্মটি টু-ওয়ে ডেটা বাইন্ডিংয়ের জন্য বিল্ট-ইন সহায়তা প্রদান করে। প্ল্যাটফর্ম কীভাবে এই সহায়তা প্রদান করে সেই সম্পর্কে বিস্তারিত জানতে, সংশ্লিষ্ট বাইন্ডিং অ্যাডাপ্টারের জন্য ইমপ্লিমেন্টেশন দেখুন:

শ্রেণী অ্যাট্রিবিউট বাইন্ডিং অ্যাডাপ্টার
AdapterView android:selectedItemPosition
android:selection
AdapterViewBindingAdapter
CalendarView android:date CalendarViewBindingAdapter
CompoundButton android:checked CompoundButtonBindingAdapter
DatePicker android:year
android:month
android:day
DatePickerBindingAdapter
NumberPicker android:value NumberPickerBindingAdapter
RadioButton android:checkedButton RadioGroupBindingAdapter
RatingBar android:rating RatingBarBindingAdapter
SeekBar android:progress SeekBarBindingAdapter
TabHost android:currentTab TabHostBindingAdapter
TextView android:text TextViewBindingAdapter
TimePicker android:hour
android:minute
TimePickerBindingAdapter

অতিরিক্ত রিসোর্স

ডেটা বাইন্ডিং সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত রিসোর্স দেখুন।

নমুনা

কোডল্যাবস

ব্লগ পোস্ট