چیدمان ها و عبارات الزام آور

زبان عبارت به شما امکان می دهد عباراتی بنویسید که رویدادهای ارسال شده توسط نماها را مدیریت می کند. کتابخانه Data Binding به طور خودکار کلاس های مورد نیاز برای اتصال نماهای موجود در طرح با اشیاء داده شما را ایجاد می کند.

فایل‌های چیدمان اتصال داده‌ها کمی متفاوت هستند و با یک برچسب ریشه layout شروع می‌شوند، سپس یک عنصر data و یک عنصر ریشه view شروع می‌شوند. این عنصر 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;
  }
}

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

کاتلین

// 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() حل می شود.

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

یک کلاس binding برای هر فایل layout تولید می شود. به طور پیش فرض، نام کلاس بر اساس نام فایل طرح بندی است که به حروف پاسکال تبدیل شده و پسوند Binding به آن اضافه شده است. به عنوان مثال، نام فایل طرح بندی قبلی activity_main.xml است، بنابراین کلاس اتصال تولید شده مربوطه ActivityMainBinding است.

این کلاس همه اتصالات از خصوصیات layout - به عنوان مثال، متغیر user - به views layout را نگه می‌دارد و می‌داند که چگونه مقادیر را برای عبارت‌های binding اختصاص دهد. همانطور که در مثال زیر نشان داده شده است، توصیه می کنیم در حین باد کردن طرح بندی، اتصالات ایجاد کنید:

کاتلین

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() کلاس‌های bindings یا کلاس 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);

زبان بیان

ویژگی های مشترک

زبان عبارت بسیار شبیه عبارات موجود در کد مدیریت شده است. می توانید از عملگرها و کلمات کلیدی زیر در زبان عبارت استفاده کنید:

  • ریاضی: + - / * %
  • الحاق رشته: +
  • منطقی: && ||
  • باینری: & | ^
  • Unary: + - ! ~
  • شیفت: >> >>> <<
  • مقایسه: == > < >= <= ( < باید به صورت &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 اشاره می کنید، جایی که age از نوع int است، داده binding از مقدار پیش فرض 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

رسیدگی به رویداد

Data binding به شما امکان می‌دهد رویدادهای مربوط به مدیریت عبارات را بنویسید که از view ها ارسال می‌شوند - به عنوان مثال، متد 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 تنظیم می کند.
  • اتصالات شنونده : این عبارات لامبدا هستند که هنگام وقوع رویداد ارزیابی می شوند. اتصال داده ها همیشه یک شنونده ایجاد می کند که آن را روی View تنظیم می کند. هنگامی که رویداد ارسال می شود، شنونده عبارت لامبدا را ارزیابی می کند.

مراجع روش

شما می توانید رویدادها را مستقیماً به متدهای کنترل کننده متصل کنید، مشابه روشی که می توانید android:onClick به یک متد در یک فعالیت اختصاص دهید. یک مزیت در مقایسه با ویژگی View onClick این است که عبارت در زمان کامپایل پردازش می شود. بنابراین، اگر متد وجود نداشته باشد یا امضای آن نادرست باشد، یک خطای زمان کامپایل دریافت می کنید.

تفاوت عمده بین مراجع روش و اتصالات شنونده در این است که اجرای واقعی شنونده زمانی ایجاد می شود که داده ها محدود می شوند، نه زمانی که رویداد راه اندازی می شود. اگر ترجیح می‌دهید عبارت را هنگام وقوع رویداد ارزیابی کنید، از اتصالات شنونده استفاده کنید.

برای اختصاص یک رویداد به کنترل کننده آن، از یک عبارت binding معمولی استفاده کنید که مقدار آن نام متدی است که باید فراخوانی کنید. برای مثال، مثال زیر را در نظر بگیرید:

کاتلین

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

جاوا

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

عبارت binding می تواند شنونده کلیک را برای یک 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>

صحافی شنونده

اتصالات شنونده عبارات الزام آور هستند که هنگام وقوع یک رویداد اجرا می شوند. آنها شبیه به مراجع متد هستند، اما به شما اجازه می دهند عبارات اتصال داده دلخواه را اجرا کنید. این ویژگی با افزونه Gradle Android برای Gradle نسخه 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>

هنگامی که یک callback در یک عبارت استفاده می شود، داده binding به طور خودکار شنونده لازم را ایجاد می کند و آن را برای رویداد ثبت می کند. هنگامی که view رویداد را اجرا می کند، data binding عبارت داده شده را ارزیابی می کند. همانطور که در مورد عبارات binding معمولی، شما امنیت 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)}"

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

کاتلین

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 نیست، عبارات شما نیز باید همان نوع مقدار را برگردانند. برای مثال، اگر می‌خواهید رویداد لمس و نگه‌داشتن (کلیک طولانی) را گوش دهید، عبارت شما باید یک Boolean برگرداند.

کاتلین

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 قابل ارزیابی نباشد، data binding مقدار پیش‌فرض آن نوع را برمی‌گرداند، مانند null برای انواع مرجع، 0 برای int ، یا false برای boolean .

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

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

از شنوندگان پیچیده دوری کنید

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

واردات، متغیرها و شامل

کتابخانه Data Binding ویژگی هایی مانند واردات، متغیرها و شامل را فراهم می کند. واردات کلاس های مرجع را در فایل های طرح بندی شما آسان می کند. متغیرها به شما این امکان را می دهند که یک ویژگی را توصیف کنید که می تواند در عبارات binding استفاده شود. شامل به شما امکان می دهد از طرح بندی های پیچیده در سراسر برنامه خود استفاده مجدد کنید.

واردات

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

<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 در فایل layout استفاده کنید.

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

می توانید از انواع وارد شده به عنوان مرجع نوع در متغیرها و عبارات استفاده کنید. مثال زیر 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 خاصیتی را توصیف می‌کند که می‌توان آن را روی طرح تنظیم کرد تا در عبارات اتصال در فایل layout استفاده شود. مثال زیر متغیرهای 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 را پیاده سازی نمی کند، متغیرها مشاهده نمی شوند .

زمانی که فایل‌های طرح‌بندی مختلف برای پیکربندی‌های مختلف (مثلاً افقی یا عمودی) وجود دارد، متغیرها با هم ترکیب می‌شوند. بین این فایل های طرح بندی نباید تعاریف متغیر متضادی وجود داشته باشد.

کلاس binding تولید شده دارای یک تنظیم کننده و دریافت کننده برای هر یک از متغیرهای توصیف شده است. متغیرها مقادیر کد مدیریت شده پیش فرض را می گیرند تا زمانی که تنظیم کننده فراخوانی شود - null برای انواع مرجع، 0 برای int ، false برای boolean و غیره.

یک متغیر خاص به نام context برای استفاده در عبارات اتصال در صورت لزوم تولید می شود. مقدار context شی Context از متد getContext() view root است. متغیر 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>

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

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

پست های وبلاگ