আর্কিটেকচার উপাদানে বিন্যাস দৃশ্য আবদ্ধ করুন

অ্যান্ড্রয়েডএক্স লাইব্রেরিতে আর্কিটেকচার উপাদান রয়েছে, যা আপনি শক্তিশালী, পরীক্ষাযোগ্য এবং রক্ষণাবেক্ষণযোগ্য অ্যাপ ডিজাইন করতে ব্যবহার করতে পারেন। ডেটা বাইন্ডিং লাইব্রেরি আপনার UI এর বিকাশকে আরও সহজ করতে আর্কিটেকচার উপাদানগুলির সাথে নির্বিঘ্নে কাজ করে৷ আপনার অ্যাপের লেআউটগুলি আর্কিটেকচার উপাদানগুলির ডেটার সাথে আবদ্ধ হতে পারে, যা আপনাকে UI কন্ট্রোলারের জীবনচক্র পরিচালনা করতে এবং ডেটাতে পরিবর্তন সম্পর্কে UI-কে অবহিত করতে সহায়তা করে৷

এই পৃষ্ঠাটি দেখায় কিভাবে ডেটা বাইন্ডিং লাইব্রেরি ব্যবহার করে সর্বাধিক সুবিধা পেতে আপনার অ্যাপে আর্কিটেকচার উপাদানগুলিকে অন্তর্ভুক্ত করতে হয়৷

ডেটা পরিবর্তন সম্পর্কে UI-কে অবহিত করতে LiveData ব্যবহার করুন

ডেটার পরিবর্তন সম্পর্কে স্বয়ংক্রিয়ভাবে UI-কে অবহিত করতে আপনি ডেটা বাইন্ডিং উত্স হিসাবে LiveData অবজেক্টগুলি ব্যবহার করতে পারেন৷ এই আর্কিটেকচার কম্পোনেন্ট সম্পর্কে আরও তথ্যের জন্য, LiveData ওভারভিউ দেখুন।

অবজেক্টের বিপরীতে যা Observable — যেমন পর্যবেক্ষণযোগ্য ক্ষেত্রগুলিLiveData অবজেক্টগুলি ডেটা পরিবর্তনের সদস্যতা নেওয়া পর্যবেক্ষকদের জীবনচক্র সম্পর্কে জানে৷ এই জ্ঞান অনেক সুবিধা সক্ষম করে, যা LiveData ব্যবহার করার সুবিধাগুলিতে ব্যাখ্যা করা হয়েছে। অ্যান্ড্রয়েড স্টুডিও সংস্করণ 3.1 এবং উচ্চতর, আপনি আপনার ডেটা বাইন্ডিং কোডে LiveData অবজেক্টের সাথে পর্যবেক্ষণযোগ্য ক্ষেত্রগুলি প্রতিস্থাপন করতে পারেন।

আপনার বাইন্ডিং ক্লাসের সাথে একটি LiveData অবজেক্ট ব্যবহার করতে, আপনাকে LiveData অবজেক্টের সুযোগ নির্ধারণ করতে একটি লাইফসাইকেল মালিককে নির্দিষ্ট করতে হবে। নিম্নলিখিত উদাহরণটি বাইন্ডিং ক্লাস ইনস্ট্যান্ট হওয়ার পরে জীবনচক্রের মালিক হিসাবে কার্যকলাপটি নির্দিষ্ট করে:

কোটলিন

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

UI-সম্পর্কিত ডেটা পরিচালনা করতে ViewModel ব্যবহার করুন

ডেটা বাইন্ডিং লাইব্রেরি ViewModel উপাদানগুলির সাথে নির্বিঘ্নে কাজ করে। ViewModel সেই ডেটা প্রকাশ করে যা লেআউট পর্যবেক্ষণ করে এবং এর পরিবর্তনগুলিতে প্রতিক্রিয়া জানায়। ডেটা বাইন্ডিং লাইব্রেরির সাথে ViewModel উপাদানগুলি ব্যবহার করা আপনাকে UI লজিককে লেআউটের বাইরে এবং উপাদানগুলিতে সরাতে দেয়, যা পরীক্ষা করা সহজ। ডেটা বাইন্ডিং লাইব্রেরি নিশ্চিত করে যে ভিউগুলি যখন প্রয়োজনে ডেটা উত্স থেকে আবদ্ধ এবং আনবাউন্ড হয়৷ আপনি সঠিক ডেটা প্রকাশ করছেন তা নিশ্চিত করা বাকি কাজগুলির বেশিরভাগই রয়েছে৷ এই আর্কিটেকচার কম্পোনেন্ট সম্পর্কে আরও তথ্যের জন্য, ViewModel ওভারভিউ দেখুন।

ডেটা বাইন্ডিং লাইব্রেরির সাথে ViewModel কম্পোনেন্ট ব্যবহার করতে, আপনাকে অবশ্যই আপনার কম্পোনেন্ট ইনস্ট্যান্টিয়েট করতে হবে—যা ViewModel ক্লাস থেকে উত্তরাধিকারসূত্রে পাওয়া যায়, আপনার বাইন্ডিং ক্লাসের একটি ইনস্ট্যান্স পান এবং আপনার ViewModel কম্পোনেন্টকে বাইন্ডিং ক্লাসের একটি প্রপার্টিতে বরাদ্দ করুন। নিম্নলিখিত উদাহরণটি লাইব্রেরির সাথে উপাদানটি কীভাবে ব্যবহার করবেন তা দেখায়:

কোটলিন

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 কম্পোনেন্টের বৈশিষ্ট্য এবং পদ্ধতিগুলি সংশ্লিষ্ট দৃষ্টিভঙ্গিতে বরাদ্দ করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

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

বাঁধাই অ্যাডাপ্টারের উপর আরো নিয়ন্ত্রণের জন্য একটি পর্যবেক্ষণযোগ্য ভিউ মডেল ব্যবহার করুন

আপনি একটি ViewModel উপাদান ব্যবহার করতে পারেন যা Observable ইন্টারফেস প্রয়োগ করে ডেটার পরিবর্তন সম্পর্কে অন্যান্য অ্যাপ উপাদানগুলিকে অবহিত করতে, যেমন আপনি একটি LiveData অবজেক্ট ব্যবহার করবেন।

এমন পরিস্থিতি রয়েছে যেখানে আপনি একটি ViewModel উপাদান ব্যবহার করতে পছন্দ করতে পারেন যা LiveData অবজেক্ট ব্যবহার করে Observable ইন্টারফেস প্রয়োগ করে, এমনকি যদি আপনি 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);
    }
}

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

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

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