দ্বি-মুখী ডেটা বাইন্ডিং

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

<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 টীকা ব্যবহার করতে পারেন, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

কোটলিন

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 ব্যবহার করে মান পরিবর্তন হলে প্রাথমিক মান এবং আপডেটগুলি সেট করে এমন পদ্ধতিটি টীকা করুন:

    কোটলিন

    @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 ব্যবহার করে ভিউ থেকে মান পড়া পদ্ধতিটি টীকা করুন:

    কোটলিন

    @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 টীকা যোগ করুন:

কোটলিন

@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 টীকা যোগ করে করা হয় এবং এই টীকাটি বিপরীত রূপান্তরকারীকে উল্লেখ করে। এই কনফিগারেশনের একটি উদাহরণ নিম্নলিখিত কোড স্নিপেটে উপস্থিত হয়:

কোটলিন

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

অতিরিক্ত সম্পদ

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

নমুনা

কোডল্যাব

ব্লগ এর লেখাগুলো

{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}