طرح‌بندی‌ها و عبارت‌های اتصال

زبان عبارت به شما امکان می‌دهد عبارت‌هایی بنویسید که رویدادهای ارسال‌شده توسط نماها را مدیریت می‌کنند. «کتابخانه اتصال داده» به‌طور خودکار کلاس‌های موردنیاز برای اتصال نماها در چیدمان با اشیای داده شما را تولید می‌کند.

فایل‌های چیدمان اتصال داده کمی متفاوت هستند و با برچسب ریشه 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>

متغیر user در data ویژگی‌ای را توصیف می‌کند که می‌تواند در این چیدمان استفاده شود:

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

عبارت‌های درون چیدمان در ویژگی‌های مشخصه بااستفاده از نحو @{} نوشته می‌شوند. در مثال زیر، نوشتار TextView روی ویژگی firstName متغیر user تنظیم شده است:

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

این نوع شیء داده‌هایی دارد که هرگز تغییر نمی‌کند. در برنامه‌ها معمول است که داده‌ها یک‌بار خوانده شوند و پس‌از آن هرگز تغییر نکنند. همچنین می‌توان از شیئی استفاده کرد که از مجموعه‌ای از قراردادها پیروی می‌کند، مانند استفاده از روش‌های دستیابی در زبان برنامه‌نویسی Java، همان‌طور که در مثال زیر نشان داده شده است:

کاتلین

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

از دیدگاه اتصال داده، این دو کلاس معادل هستند. عبارت @{user.firstName} که برای مشخصه android:text استفاده می‌شود، به فیلد firstName در کلاس اول و روش getFirstName() در کلاس دوم دسترسی پیدا می‌کند. همچنین به firstName() حل‌وفصل می‌شود، اگر آن روش وجود داشته باشد.

داده‌های الزام‌آور

برای هر فایل چیدمان، یک کلاس اتصال ایجاد می‌شود. به‌طور پیش‌فرض، نام کلاس براساس نام فایل چیدمان است که به Pascal case تبدیل شده است و پسوند 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);
}

در زمان اجرا، برنامه کاربر آزمایشی را در واسط کاربر نمایش می‌دهد. یا می‌توانید بااستفاده از 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 اختصاص داده می‌شود. اگر به user.age ارجاع دهید، که در آن age از نوع int است، اتصال داده از مقدار پیش‌فرض 0 استفاده می‌کند.

مشاهده مرجع‌ها

یک عبارت می‌تواند بااستفاده از نحو زیر، ازطریق شناسه به نماهای دیگر در چیدمان ارجاع دهد:

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>

بست‌های شنونده

اتصال‌های شنونده عبارت‌های اتصالی هستند که هنگام وقوع رویداد اجرا می‌شوند. این‌ها شبیه ارجاع‌های روش هستند، اما به شما امکان می‌دهند عبارت‌های دلخواه اتصال داده را اجرا کنید. این ویژگی با «افزایه Android Gradle» برای Gradle نسخه ۲.۰ و بالاتر دردسترس است.

در ارجاع‌های روش، پارامترهای روش باید با پارامترهای شنونده رویداد مطابقت داشته باشد. در اتصال‌های شنونده، فقط مقدار برگشتی شما باید با مقدار برگشتی موردانتظار شنونده مطابقت داشته باشد، مگراینکه انتظار 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>

وقتی از پاسخ تماس در عبارت استفاده می‌شود، اتصال داده به‌طور خودکار شنونده لازم را ایجاد می‌کند و آن را برای رویداد ثبت می‌کند. وقتی نما رویداد را فعال می‌کند، اتصال داده عبارت داده‌شده را ارزیابی می‌کند. همانند عبارات اتصال معمولی، هنگام ارزیابی این عبارات شنونده، ایمنی null و thread اتصال داده را دریافت می‌کنید.

در مثال قبلی، پارامتر 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)}"

و می‌توانید از عبارت lambda با بیش‌از یک پارامتر استفاده کنید:

کاتلین

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 برای انواع مرجع، 0 برای int، یا false برای boolean.

اگر لازم است از عبارتی با گزاره استفاده کنید (مثلاً سه‌تایی)، می‌توانید از void به‌عنوان نماد استفاده کنید:

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

اجتناب از شنونده‌های پیچیده

عبارت‌های شنونده قدرتمند هستند و می‌توانند خواندن کد شما را آسان‌تر کنند. ازسوی دیگر، شنوندگان حاوی عبارت‌های پیچیده باعث می‌شوند چیدمان‌هایتان سخت‌تر خوانده و نگهداری شوند. عبارت‌هایتان را به‌سادگی ارسال داده‌های دردسترس از میانای کاربر به روش callback نگه دارید. هرگونه منطق کسب‌وکار را در داخل روش callback که از عبارت شنونده فراخوانی می‌کنید پیاده‌سازی کنید.

واردات، متغیرها، و دربرگیرنده‌ها

«کتابخانه اتصال داده» ویژگی‌هایی مانند وارد کردن، متغیرها، و شامل کردن را ارائه می‌دهد. وارد کردن‌ها باعث می‌شود کلاس‌های ارجاع آسان در فایل‌های چیدمان شما ایجاد شود. متغیرها به شما امکان می‌دهند ویژگی‌ای را توصیف کنید که می‌تواند در عبارت‌های مقیدسازی استفاده شود. ‫Includes به شما امکان می‌دهد از چیدمان‌های پیچیده در سراسر برنامه‌تان دوباره استفاده کنید.

واردات

وارد کردن‌ها به شما امکان می‌دهند به کلاس‌های داخل فایل چیدمانتان ارجاع دهید، مثل کد مدیریت‌شده. می‌توانید از صفر یا چند عنصر import در عنصر data استفاده کنید. نمونه کد زیر کلاس View را به فایل چیدمان وارد می‌کند:

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

وارد کردن کلاس View به شما امکان می‌دهد از عبارات اتصال به آن ارجاع دهید. مثال زیر نحوه ارجاع به ثابت‌های VISIBLE و GONE از کلاس View را نشان می‌دهد:

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

نام‌های مستعار را تایپ کنید

وقتی نام کلاس‌ها تداخل داشته باشد، می‌توانید نام یکی از کلاس‌ها را به نام مستعار تغییر دهید. مثال زیر نام کلاس View را در بسته com.example.real.estate به Vista تغییر می‌دهد:

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

سپس می‌توانید از Vista برای ارجاع به com.example.real.estate.View و از View برای ارجاع به android.view.View در فایل چیدمان استفاده کنید.

وارد کردن کلاس‌های دیگر

می‌توانید از انواع واردشده به‌عنوان مرجع نوع در متغیرها و عبارات استفاده کنید. مثال زیر نشان می‌دهد که 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>

می‌توانید از انواع واردشده برای تبدیل بخشی از عبارت استفاده کنید. مثال زیر ویژگی connection را به نوع User تبدیل می‌کند:

<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.* به‌طور خودکار وارد می‌شود.

متغیرها

می‌توانید از چند عنصر variable در عنصر data استفاده کنید. هر عنصر 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 برای انواع مرجع، 0 برای int، false برای boolean، و غیره.

متغیر ویژه‌ای به‌نام context برای استفاده در عبارت‌های مقیدسازی درصورت نیاز تولید می‌شود. مقدار context، شیء Context از روش getContext() نمای ریشه است. متغیر context با اعلام متغیر صریح با آن نام لغو می‌شود.

شامل

می‌توانید متغیرها را بااستفاده از فضای نام برنامه و نام متغیر در یک مشخصه، از چیدمان دربرگیرنده به اتصال چیدمان گنجانده‌شده منتقل کنید. مثال زیر متغیرهای user گنجانده‌شده از فایل‌های چیدمان name.xml و contact.xml را نشان می‌دهد:

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

اتصال داده از include به‌عنوان فرزند مستقیم عنصر merge پشتیبانی نمی‌کند. برای مثال، از چیدمان زیر پشتیبانی نمی‌شود:

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

منابع بیشتر

برای کسب اطلاعات بیشتر درباره اتصال داده، به منابع تکمیلی زیر مراجعه کنید.

نمونه‌ها

Codelabs

پست‌های وبلاگ