লেআউট এবং বাইন্ডিং এক্সপ্রেশন

অভিব্যক্তি ভাষা আপনাকে অভিব্যক্তি লিখতে দেয় যা দৃশ্য দ্বারা প্রেরিত ঘটনাগুলি পরিচালনা করে। ডেটা বাইন্ডিং লাইব্রেরি স্বয়ংক্রিয়ভাবে আপনার ডেটা অবজেক্টের সাথে লেআউটে ভিউ আবদ্ধ করার জন্য প্রয়োজনীয় ক্লাস তৈরি করে।

ডেটা বাইন্ডিং লেআউট ফাইলগুলি কিছুটা আলাদা এবং layout একটি রুট ট্যাগ দিয়ে শুরু হয়, তারপরে একটি data উপাদান এবং একটি view রুট উপাদান। এই ভিউ এলিমেন্ট হল আপনার রুট একটি নন-বাইন্ডিং লেআউট ফাইলে। নিম্নলিখিত কোড একটি নমুনা বিন্যাস ফাইল দেখায়:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"/>
   </LinearLayout>
</layout>

data মধ্যে user ভেরিয়েবল এমন একটি সম্পত্তি বর্ণনা করে যা এই লেআউটের মধ্যে ব্যবহার করা যেতে পারে:

<variable name="user" type="com.example.User" />

লেআউটের মধ্যে অভিব্যক্তিগুলি @{} সিনট্যাক্স ব্যবহার করে বৈশিষ্ট্য বৈশিষ্ট্যে লেখা হয়। নিম্নলিখিত উদাহরণে, TextView পাঠ্য user ভেরিয়েবলের firstName বৈশিষ্ট্যে সেট করা হয়েছে:

<TextView android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@{user.firstName}" />

ডেটা অবজেক্ট

ধরুন আপনার কাছে User সত্তা বর্ণনা করার জন্য একটি সাধারণ বস্তু আছে:

কোটলিন

data class User(val firstName: String, val lastName: String)

জাভা


public class User {
  public final String firstName;
  public final String lastName;
  public User(String firstName, String lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
  }
}

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

কোটলিন

// Not applicable in Kotlin.
data class User(val firstName: String, val lastName: String)

জাভা

public class User {
  private final String firstName;
  private final String lastName;
  public User(String firstName, String lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
  }
  public String getFirstName() {
      return this.firstName;
  }
  public String getLastName() {
      return this.lastName;
  }
}

ডেটা বাইন্ডিংয়ের দৃষ্টিকোণ থেকে, এই দুটি শ্রেণী সমতুল্য। android:text অ্যাট্রিবিউটের জন্য ব্যবহৃত @{user.firstName} এক্সপ্রেশনটি আগের ক্লাসে firstName ফিল্ড এবং পরবর্তী ক্লাসে getFirstName() মেথড অ্যাক্সেস করে। এটি firstName() তেও সমাধান করা হয়, যদি সেই পদ্ধতিটি বিদ্যমান থাকে।

বাইন্ডিং ডেটা

প্রতিটি লেআউট ফাইলের জন্য একটি বাইন্ডিং ক্লাস তৈরি করা হয়। ডিফল্টরূপে, ক্লাসের নাম লেআউট ফাইলের নামের উপর ভিত্তি করে তৈরি করা হয়, যা Pascal ক্ষেত্রে রূপান্তরিত হয়, এতে Binding প্রত্যয় যোগ করা হয়। উদাহরণস্বরূপ, পূর্ববর্তী লেআউট ফাইলের নাম হল activity_main.xml , তাই সংশ্লিষ্ট জেনারেটেড বাইন্ডিং ক্লাস হল ActivityMainBinding

এই ক্লাসটি লেআউটের বৈশিষ্ট্যগুলি থেকে সমস্ত বাইন্ডিং ধারণ করে—উদাহরণস্বরূপ, user ভেরিয়েবল-লেআউটের দৃষ্টিভঙ্গির জন্য এবং বাইন্ডিং এক্সপ্রেশনগুলির জন্য কীভাবে মান নির্ধারণ করতে হয় তা জানে। আমরা লেআউট স্ফীত করার সময় বাইন্ডিং তৈরি করার পরামর্শ দিই, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding: ActivityMainBinding = DataBindingUtil.setContentView(
            this, R.layout.activity_main)

    binding.user = User("Test", "User")
}

জাভা

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
   User user = new User("Test", "User");
   binding.setUser(user);
}

রানটাইমে, অ্যাপটি UI এ টেস্ট ব্যবহারকারীকে প্রদর্শন করে। বিকল্পভাবে, আপনি একটি LayoutInflater ব্যবহার করে ভিউ পেতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

val binding: ActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater())

জাভা

ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());

আপনি যদি একটি Fragment , ListView , বা RecyclerView অ্যাডাপ্টারের মধ্যে ডেটা বাইন্ডিং আইটেমগুলি ব্যবহার করেন, তাহলে আপনি বাইন্ডিং ক্লাসের inflate() পদ্ধতিগুলি বা DataBindingUtil ক্লাস ব্যবহার করতে পছন্দ করতে পারেন, যেমনটি নিম্নলিখিত কোড উদাহরণে দেখানো হয়েছে:

কোটলিন

val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false)
// or
val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)

জাভা

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
// or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

অভিব্যক্তির ভাষা

সাধারণ বৈশিষ্ট্য

অভিব্যক্তির ভাষাটি অনেকটা পরিচালিত কোডে পাওয়া অভিব্যক্তির মতো দেখায়। আপনি অভিব্যক্তি ভাষায় নিম্নলিখিত অপারেটর এবং কীওয়ার্ড ব্যবহার করতে পারেন:

  • গাণিতিক: + - / * %
  • স্ট্রিং সংযোগ: +
  • যৌক্তিক: && ||
  • বাইনারি: & | ^
  • ইউনারি: + - ! ~
  • শিফটঃ >> >>> <<
  • তুলনা: == > < >= <= ( < কে &lt; হিসাবে পালাতে হবে)
  • instanceof
  • গ্রুপিং: ()
  • আক্ষরিক, যেমন অক্ষর, স্ট্রিং, সংখ্যাসূচক, null
  • কাস্ট
  • পদ্ধতি কল
  • ক্ষেত্র অ্যাক্সেস
  • অ্যারে অ্যাক্সেস: []
  • টার্নারি অপারেটর: ?:

এখানে কিছু উদাহরণ আছে:

android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age > 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'

অনুপস্থিত অপারেশন

নিম্নলিখিত ক্রিয়াকলাপগুলি এক্সপ্রেশন সিনট্যাক্স থেকে অনুপস্থিত যা আপনি পরিচালিত কোডে ব্যবহার করতে পারেন:

  • this
  • super
  • new
  • সুস্পষ্ট জেনেরিক আহ্বান

নাল কোলেসিং অপারেটর

নাল কোলেসিং অপারেটর ( ?? ) বাম অপারেন্ড বেছে নেয় যদি এটি null না হয় বা ডানটি যদি আগেরটি null হয়:

android:text="@{user.displayName ?? user.lastName}"

এটি কার্যকরীভাবে নিম্নলিখিতগুলির সমতুল্য:

android:text="@{user.displayName != null ? user.displayName : user.lastName}"

সম্পত্তির উল্লেখ

একটি অভিব্যক্তি নিম্নলিখিত বিন্যাস ব্যবহার করে একটি ক্লাসে একটি সম্পত্তি উল্লেখ করতে পারে, যা ক্ষেত্র, গেটার এবং ObservableField অবজেক্টের জন্য একই:

android:text="@{user.lastName}"

নাল পয়েন্টার ব্যতিক্রমগুলি এড়িয়ে চলুন

জেনারেটেড ডেটা বাইন্ডিং কোড স্বয়ংক্রিয়ভাবে null মান পরীক্ষা করে এবং নাল পয়েন্টার ব্যতিক্রম এড়িয়ে যায়। উদাহরণ স্বরূপ, @{user.name} এক্সপ্রেশনে , যদি user null হয়, user.name null এর ডিফল্ট মান নির্ধারণ করা হয়। আপনি যদি user.age উল্লেখ করেন, যেখানে বয়স int টাইপ হয়, তাহলে ডেটা বাইন্ডিং 0 এর ডিফল্ট মান ব্যবহার করে।

রেফারেন্স দেখুন

একটি অভিব্যক্তি নিম্নলিখিত সিনট্যাক্স ব্যবহার করে, ID দ্বারা বিন্যাসে অন্যান্য মতামত উল্লেখ করতে পারে:

android:text="@{exampleText.text}"

নিম্নলিখিত উদাহরণে, TextView ভিউ একই লেআউটে একটি EditText ভিউ উল্লেখ করে:

<EditText
    android:id="@+id/example_text"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"/>
<TextView
    android:id="@+id/example_output"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{exampleText.text}"/>

সংগ্রহ

আপনি সুবিধার জন্য [] অপারেটর ব্যবহার করে সাধারণ সংগ্রহ, যেমন অ্যারে, তালিকা, স্পার্স তালিকা এবং মানচিত্র অ্যাক্সেস করতে পারেন।

<data>
    <import type="android.util.SparseArray"/>
    <import type="java.util.Map"/>
    <import type="java.util.List"/>
    <variable name="list" type="List&lt;String>"/>
    <variable name="sparse" type="SparseArray&lt;String>"/>
    <variable name="map" type="Map&lt;String, String>"/>
    <variable name="index" type="int"/>
    <variable name="key" type="String"/>
</data>
...
android:text="@{list[index]}"
...
android:text="@{sparse[index]}"
...
android:text="@{map[key]}"

আপনি object.key স্বরলিপি ব্যবহার করে মানচিত্রে একটি মান উল্লেখ করতে পারেন। উদাহরণস্বরূপ, আপনি @{map.key} দিয়ে পূর্ববর্তী উদাহরণে @{map[key]} প্রতিস্থাপন করতে পারেন।

স্ট্রিং আক্ষরিক

আপনি বৈশিষ্ট্য মান ঘিরে একক উদ্ধৃতি ব্যবহার করতে পারেন, যা আপনাকে অভিব্যক্তিতে ডবল উদ্ধৃতি ব্যবহার করতে দেয়, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

android:text='@{map["firstName"]}'

আপনি অ্যাট্রিবিউট মান ঘিরে ডবল উদ্ধৃতি ব্যবহার করতে পারেন। এটি করার সময়, স্ট্রিং লিটারেলগুলিকে অবশ্যই ` দিয়ে ঘিরে রাখতে হবে, যেমনটি এখানে দেখানো হয়েছে:

android:text="@{map[`firstName`]}"

সম্পদ

একটি অভিব্যক্তি নিম্নলিখিত সিনট্যাক্স সহ অ্যাপ সংস্থানগুলিকে উল্লেখ করতে পারে:

android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"

আপনি প্যারামিটার প্রদান করে বিন্যাস স্ট্রিং এবং বহুবচন মূল্যায়ন করতে পারেন:

android:text="@{@string/nameFormat(firstName, lastName)}"
android:text="@{@plurals/banana(bananaCount)}"

আপনি সম্পত্তি রেফারেন্স পাস করতে পারেন এবং সম্পদ পরামিতি হিসাবে রেফারেন্স দেখতে পারেন :

android:text="@{@string/example_resource(user.lastName, exampleText.text)}"

যখন একটি বহুবচন একাধিক প্যারামিটার নেয়, তখন সমস্ত পরামিতি পাস করুন:


  Have an orange
  Have %d oranges

android:text="@{@plurals/orange(orangeCount, orangeCount)}"

কিছু সম্পদের সুস্পষ্ট প্রকার মূল্যায়ন প্রয়োজন, যেমনটি নিম্নলিখিত সারণীতে দেখানো হয়েছে:

টাইপ সাধারণ রেফারেন্স অভিব্যক্তি রেফারেন্স
String[] @array @stringArray
int[] @array @intArray
TypedArray @array @typedArray
Animator @animator @animator
StateListAnimator @animator @stateListAnimator
color int @color @color
ColorStateList @color @colorStateList

ইভেন্ট পরিচালনা

ডেটা বাইন্ডিং আপনাকে এক্সপ্রেশন হ্যান্ডলিং ইভেন্টগুলি লিখতে দেয় যা ভিউ থেকে পাঠানো হয়—উদাহরণস্বরূপ, onClick() পদ্ধতি। ইভেন্ট অ্যাট্রিবিউটের নামগুলি শ্রোতা পদ্ধতির নাম দ্বারা নির্ধারিত হয়, কয়েকটি ব্যতিক্রম সহ। উদাহরণস্বরূপ, View.OnClickListener এর একটি পদ্ধতি আছে onClick() , তাই এই ইভেন্টের বৈশিষ্ট্য হল android:onClick

ক্লিক ইভেন্টের জন্য কিছু বিশেষ ইভেন্ট হ্যান্ডলার আছে যাদের দ্বন্দ্ব এড়াতে android:onClick ছাড়া অন্য একটি বৈশিষ্ট্যের প্রয়োজন। এই ধরনের দ্বন্দ্ব এড়াতে আপনি নিম্নলিখিত বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন:

ক্লাস লিসেনার সেটার বৈশিষ্ট্য
SearchView setOnSearchClickListener(View.OnClickListener) android:onSearchClick
ZoomControls setOnZoomInClickListener(View.OnClickListener) android:onZoomIn
ZoomControls setOnZoomOutClickListener(View.OnClickListener) android:onZoomOut

আপনি একটি ইভেন্ট পরিচালনা করতে এই দুটি প্রক্রিয়া ব্যবহার করতে পারেন, যা অনুসরণ করা বিভাগগুলিতে বিশদভাবে বর্ণিত হয়েছে:

  • পদ্ধতির রেফারেন্স : আপনার অভিব্যক্তিতে, আপনি শ্রোতা পদ্ধতির স্বাক্ষরের সাথে সামঞ্জস্যপূর্ণ পদ্ধতিগুলি উল্লেখ করতে পারেন। যখন একটি অভিব্যক্তি একটি পদ্ধতির রেফারেন্সে মূল্যায়ন করে, তখন ডেটা বাইন্ডিং পদ্ধতির রেফারেন্স এবং মালিকের বস্তুকে শ্রোতার মধ্যে আবৃত করে এবং সেই শ্রোতাকে লক্ষ্য দৃশ্যে সেট করে। অভিব্যক্তিটি null এ মূল্যায়ন করলে, ডেটা বাইন্ডিং একটি শ্রোতা তৈরি করে না এবং পরিবর্তে একটি null শ্রোতা সেট করে।
  • শ্রোতা বাইন্ডিং : এগুলি ল্যাম্বডা এক্সপ্রেশন যা ঘটনা ঘটলে মূল্যায়ন করা হয়। ডেটা বাইন্ডিং সর্বদা একটি শ্রোতা তৈরি করে, যা এটি ভিউতে সেট করে। ইভেন্টটি পাঠানো হলে, শ্রোতা ল্যাম্বডা অভিব্যক্তিটি মূল্যায়ন করে।

পদ্ধতির উল্লেখ

আপনি হ্যান্ডলার পদ্ধতিতে ইভেন্টগুলিকে সরাসরি আবদ্ধ করতে পারেন, যেভাবে আপনি android:onClick একটি ক্রিয়াকলাপে একটি পদ্ধতিতে বরাদ্দ করতে পারেন। View onClick অ্যাট্রিবিউটের তুলনায় একটি সুবিধা হল যে এক্সপ্রেশনটি কম্পাইলের সময় প্রক্রিয়া করা হয়। সুতরাং, যদি পদ্ধতিটি বিদ্যমান না থাকে বা এর স্বাক্ষরটি ভুল হয়, আপনি একটি কম্পাইল সময় ত্রুটি পাবেন।

পদ্ধতির রেফারেন্স এবং লিসেনার বাইন্ডিংয়ের মধ্যে প্রধান পার্থক্য হল যে প্রকৃত শ্রোতা বাস্তবায়ন তৈরি হয় যখন ডেটা আবদ্ধ হয়, ইভেন্টটি ট্রিগার করার সময় নয়। ঘটনা ঘটলে আপনি অভিব্যক্তি মূল্যায়ন করতে পছন্দ করলে, শ্রোতা বাইন্ডিং ব্যবহার করুন।

তার হ্যান্ডলারে একটি ইভেন্ট বরাদ্দ করতে, একটি সাধারণ বাইন্ডিং এক্সপ্রেশন ব্যবহার করুন, যার মানটি কল করার পদ্ধতির নাম। উদাহরণস্বরূপ, নিম্নলিখিত উদাহরণ লেআউট ডেটা অবজেক্ট বিবেচনা করুন:

কোটলিন

class MyHandlers {
    fun onClickFriend(view: View) { ... }
}

জাভা

public class MyHandlers {
    public void onClickFriend(View view) { ... }
}

বাইন্ডিং এক্সপ্রেশনটি ক্লিক শ্রোতাকে onClickFriend() পদ্ধতিতে দেখার জন্য বরাদ্দ করতে পারে, নিম্নরূপ:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="handlers" type="com.example.MyHandlers"/>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
           android:onClick="@{handlers::onClickFriend}"/>
   </LinearLayout>
</layout>

লিসেনার বাইন্ডিং

লিসেনার বাইন্ডিং হল বাইন্ডিং এক্সপ্রেশন যা কোনো ঘটনা ঘটলে চলে। এগুলি মেথড রেফারেন্সের অনুরূপ, কিন্তু তারা আপনাকে নির্বিচারে ডেটা বাইন্ডিং এক্সপ্রেশন চালাতে দেয়। এই বৈশিষ্ট্যটি গ্রেডল সংস্করণ 2.0 এবং তার পরের জন্য অ্যান্ড্রয়েড গ্রেডল প্লাগইনের সাথে উপলব্ধ।

পদ্ধতির রেফারেন্সে, পদ্ধতির পরামিতি অবশ্যই ইভেন্ট শ্রোতার পরামিতিগুলির সাথে মেলে। লিসেনার বাইন্ডিং-এ, শুধুমাত্র আপনার রিটার্ন মান অবশ্যই শ্রোতার প্রত্যাশিত রিটার্ন মানের সাথে মেলে, যদি না এটি void আশা করে। উদাহরণস্বরূপ, নিম্নলিখিত উপস্থাপক শ্রেণীটি বিবেচনা করুন যার একটি onSaveClick() পদ্ধতি রয়েছে:

কোটলিন

class Presenter {
    fun onSaveClick(task: Task){}
}

জাভা

public class Presenter {
    public void onSaveClick(Task task){}
}

আপনি ক্লিক ইভেন্টটিকে নিচের মতো onSaveClick() পদ্ধতিতে আবদ্ধ করতে পারেন:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="task" type="com.android.example.Task" />
        <variable name="presenter" type="com.android.example.Presenter" />
    </data>
    <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
        <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:onClick="@{() -> presenter.onSaveClick(task)}" />
    </LinearLayout>
</layout>

যখন একটি অভিব্যক্তিতে একটি কলব্যাক ব্যবহার করা হয়, তখন ডেটা বাইন্ডিং স্বয়ংক্রিয়ভাবে প্রয়োজনীয় শ্রোতা তৈরি করে এবং ইভেন্টের জন্য এটি নিবন্ধন করে। যখন ভিউ ইভেন্টটি ফায়ার করে, ডেটা বাইন্ডিং প্রদত্ত অভিব্যক্তিকে মূল্যায়ন করে। রেগুলার বাইন্ডিং এক্সপ্রেশনের মত, আপনি ডাটা বাইন্ডিং এর নাল এবং থ্রেড নিরাপত্তা পাবেন যখন এই শ্রোতা এক্সপ্রেশনগুলি মূল্যায়ন করা হচ্ছে।

পূর্ববর্তী উদাহরণে, view প্যারামিটার যা onClick(View) এ পাস করা হয়েছে তা সংজ্ঞায়িত করা হয়নি। শ্রোতা বাইন্ডিং শ্রোতা পরামিতিগুলির জন্য দুটি পছন্দ প্রদান করে: আপনি পদ্ধতিতে সমস্ত পরামিতি উপেক্ষা করতে পারেন বা তাদের সকলের নাম দিতে পারেন। আপনি যদি পরামিতিগুলির নাম দিতে পছন্দ করেন তবে আপনি সেগুলিকে আপনার অভিব্যক্তিতে ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি নিম্নরূপ পূর্ববর্তী অভিব্যক্তি লিখতে পারেন:

android:onClick="@{(view) -> presenter.onSaveClick(task)}"

আপনি যদি অভিব্যক্তিতে প্যারামিটার ব্যবহার করতে চান তবে আপনি এটি নিম্নরূপ করতে পারেন:

কোটলিন

class Presenter {
    fun onSaveClick(view: View, task: Task){}
}

জাভা

public class Presenter {
    public void onSaveClick(View view, Task task){}
}

android:onClick="@{(theView) -> presenter.onSaveClick(theView, task)}"

এবং আপনি একাধিক প্যারামিটার সহ একটি ল্যাম্বডা এক্সপ্রেশন ব্যবহার করতে পারেন:

কোটলিন

class Presenter {
    fun onCompletedChanged(task: Task, completed: Boolean){}
}

জাভা

public class Presenter {
    public void onCompletedChanged(Task task, boolean completed){}
}

<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content"
      android:onCheckedChanged="@{(cb, isChecked) -> presenter.completeChanged(task, isChecked)}" />

আপনি যে ইভেন্টটি শুনছেন তা যদি এমন একটি মান প্রদান করে যার ধরনটি void নয়, আপনার অভিব্যক্তিগুলিকে অবশ্যই একই ধরণের মান প্রদান করতে হবে। উদাহরণস্বরূপ, আপনি যদি টাচ অ্যান্ড হোল্ড (দীর্ঘ ক্লিক) ইভেন্টের জন্য শুনতে চান, আপনার অভিব্যক্তিটি অবশ্যই একটি বুলিয়ান প্রদান করবে।

কোটলিন

class Presenter {
    fun onLongClick(view: View, task: Task): Boolean { }
}

জাভা

public class Presenter {
    public boolean onLongClick(View view, Task task) { }
}

android:onLongClick="@{(theView) -> presenter.onLongClick(theView, task)}"

যদি null অবজেক্টের কারণে এক্সপ্রেশনটি মূল্যায়ন করা না যায়, তাহলে ডেটা বাইন্ডিং সেই ধরনের জন্য ডিফল্ট মান প্রদান করে, যেমন রেফারেন্স প্রকারের জন্য null , int জন্য 0 বা boolean জন্য false

আপনি যদি একটি ভবিষ্যদ্বাণী সহ একটি অভিব্যক্তি ব্যবহার করতে চান-উদাহরণস্বরূপ, একটি টার্নারি-আপনি একটি প্রতীক হিসাবে void ব্যবহার করতে পারেন:

android:onClick="@{(v) -> v.isVisible() ? doSomething() : void}"

জটিল শ্রোতাদের এড়িয়ে চলুন

শ্রোতা অভিব্যক্তি শক্তিশালী এবং আপনার কোড পড়া সহজ করে তোলে। অন্যদিকে, শ্রোতাদের জটিল অভিব্যক্তিগুলি আপনার লেআউটগুলি পড়া এবং বজায় রাখা কঠিন করে তোলে। আপনার অভিব্যক্তিগুলিকে আপনার UI থেকে আপনার কলব্যাক পদ্ধতিতে উপলব্ধ ডেটা পাস করার মতো সহজ রাখুন। শ্রোতার অভিব্যক্তি থেকে আপনি যে কলব্যাক পদ্ধতিটি আহ্বান করেন তার মধ্যে যেকোন ব্যবসায়িক যুক্তি প্রয়োগ করুন।

আমদানি, পরিবর্তনশীল, এবং অন্তর্ভুক্ত

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

আমদানি

আমদানি আপনাকে আপনার লেআউট ফাইলের ভিতরে ক্লাস রেফারেন্স করতে দেয়, যেমন পরিচালিত কোডে। আপনি data উপাদানের ভিতরে শূন্য বা তার বেশি import উপাদান ব্যবহার করতে পারেন। নিম্নলিখিত কোড উদাহরণ লেআউট ফাইলে View ক্লাস আমদানি করে:

<data>
    <import type="android.view.View"/>
</data>

View ক্লাস ইম্পোর্ট করা আপনাকে এটিকে আপনার বাইন্ডিং এক্সপ্রেশন থেকে উল্লেখ করতে দেয়। নিম্নলিখিত উদাহরণটি দেখায় কিভাবে View ক্লাসের VISIBLE এবং GONE ধ্রুবকগুলিকে উল্লেখ করতে হয়:

<TextView
   android:text="@{user.lastName}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

উপনাম টাইপ করুন

যখন ক্লাসের নামের দ্বন্দ্ব থাকে, আপনি ক্লাসগুলির একটির নাম পরিবর্তন করতে পারেন একটি উপনামে। নিম্নলিখিত উদাহরণটি com.example.real.estate প্যাকেজের View ক্লাসের নাম পরিবর্তন করে Vista তে দেয়:

<import type="android.view.View"/>
<import type="com.example.real.estate.View"
        alias="Vista"/>

তারপর আপনি লেআউট ফাইলের মধ্যে com.example.real.estate.View এবং android.view.View View করতে Vista ব্যবহার করতে পারেন।

অন্যান্য ক্লাস আমদানি করুন

আপনি ভেরিয়েবল এবং এক্সপ্রেশনে টাইপ রেফারেন্স হিসাবে আমদানি করা প্রকারগুলি ব্যবহার করতে পারেন। নিম্নলিখিত উদাহরণটি একটি ভেরিয়েবলের ধরন হিসাবে ব্যবহৃত User এবং List দেখায়:

<data>
    <import type="com.example.User"/>
    <import type="java.util.List"/>
    <variable name="user" type="User"/>
    <variable name="userList" type="List&lt;User>"/>
</data>

আপনি একটি অভিব্যক্তির অংশ কাস্ট করতে আমদানি করা প্রকারগুলি ব্যবহার করতে পারেন। নিম্নলিখিত উদাহরণটি User একটি প্রকারের সাথে connection বৈশিষ্ট্যকে নিক্ষেপ করে:

<TextView
   android:text="@{((User)(user.connection)).lastName}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

অভিব্যক্তিতে স্ট্যাটিক ক্ষেত্র এবং পদ্ধতি উল্লেখ করার সময় আপনি আমদানি করা প্রকারগুলিও ব্যবহার করতে পারেন। নিম্নলিখিত কোডটি MyStringUtils ক্লাস আমদানি করে এবং এর capitalize পদ্ধতি উল্লেখ করে:

<data>
    <import type="com.example.MyStringUtils"/>
    <variable name="user" type="com.example.User"/>
</data>
…
<TextView
   android:text="@{MyStringUtils.capitalize(user.lastName)}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

ঠিক যেমন পরিচালিত কোডে, java.lang.* স্বয়ংক্রিয়ভাবে আমদানি করা হয়।

ভেরিয়েবল

আপনি data উপাদানের ভিতরে একাধিক variable উপাদান ব্যবহার করতে পারেন। প্রতিটি variable উপাদান একটি বৈশিষ্ট্য বর্ণনা করে যা লেআউট ফাইলের মধ্যে বাইন্ডিং এক্সপ্রেশনে ব্যবহার করার জন্য লেআউটে সেট করা যেতে পারে। নিম্নলিখিত উদাহরণ user , image এবং note ভেরিয়েবল ঘোষণা করে:

<data>
    <import type="android.graphics.drawable.Drawable"/>
    <variable name="user" type="com.example.User"/>
    <variable name="image" type="Drawable"/>
    <variable name="note" type="String"/>
</data>

ভেরিয়েবলের ধরনগুলি কম্পাইলের সময় পরিদর্শন করা হয়, তাই যদি একটি ভেরিয়েবল Observable প্রয়োগ করে বা একটি পর্যবেক্ষণযোগ্য সংগ্রহ হয়, তাহলে সেটি অবশ্যই টাইপের মধ্যে প্রতিফলিত হবে। যদি ভেরিয়েবলটি একটি বেস ক্লাস বা ইন্টারফেস হয় যা Observable ইন্টারফেস বাস্তবায়ন না করে, তাহলে ভেরিয়েবলগুলি পর্যবেক্ষণ করা হয় না

যখন বিভিন্ন কনফিগারেশনের জন্য বিভিন্ন লেআউট ফাইল থাকে (উদাহরণস্বরূপ, ল্যান্ডস্কেপ বা প্রতিকৃতি), ভেরিয়েবলগুলি একত্রিত হয়। এই লেআউট ফাইলগুলির মধ্যে পরস্পরবিরোধী পরিবর্তনশীল সংজ্ঞা থাকতে হবে না।

উত্পন্ন বাইন্ডিং ক্লাসে বর্ণিত প্রতিটি ভেরিয়েবলের জন্য একটি সেটার এবং গেটার রয়েছে। ভেরিয়েবলগুলি ডিফল্ট পরিচালিত কোড মানগুলি গ্রহণ করে যতক্ষণ না সেটার বলা হয়— রেফারেন্স প্রকারের জন্য null , int জন্য 0 , boolean জন্য false , ইত্যাদি।

প্রয়োজন অনুসারে বাইন্ডিং এক্সপ্রেশনে ব্যবহারের জন্য context নামে একটি বিশেষ পরিবর্তনশীল তৈরি করা হয়। context মান হল রুট ভিউ এর getContext() পদ্ধতি থেকে Context বস্তু। context ভেরিয়েবলটি সেই নামের সাথে একটি স্পষ্ট পরিবর্তনশীল ঘোষণা দ্বারা ওভাররাইড করা হয়েছে।

অন্তর্ভুক্ত

আপনি একটি অ্যাট্রিবিউটে অ্যাপের নামস্থান এবং পরিবর্তনশীল নাম ব্যবহার করে অন্তর্ভুক্ত লেআউট থেকে একটি অন্তর্ভুক্ত লেআউটের বাঁধাইতে ভেরিয়েবলগুলি পাস করতে পারেন। নিচের উদাহরণটি name.xml এবং contact.xml লেআউট ফাইল থেকে user ভেরিয়েবল অন্তর্ভুক্ত দেখায়:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:bind="http://schemas.android.com/apk/res-auto">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <include layout="@layout/name"
           bind:user="@{user}"/>
       <include layout="@layout/contact"
           bind:user="@{user}"/>
   </LinearLayout>
</layout>

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

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:bind="http://schemas.android.com/apk/res-auto">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <merge><!-- Doesn't work -->
       <include layout="@layout/name"
           bind:user="@{user}"/>
       <include layout="@layout/contact"
           bind:user="@{user}"/>
   </merge>
</layout>

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

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

নমুনা

কোডল্যাব

ব্লগ পোস্ট