زبان عبارت به شما امکان می دهد عباراتی بنویسید که رویدادهای ارسال شده توسط نماها را مدیریت می کند. کتابخانه 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:
+ - ! ~
- شیفت:
>> >>> <<
- مقایسه:
== > < >= <=
(<
باید به صورت<
) فرار شود) -
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<String>"/>
<variable name="sparse" type="SparseArray<String>"/>
<variable name="map" type="Map<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<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>
برای کسب اطلاعات بیشتر در مورد اتصال داده ها، به منابع اضافی زیر مراجعه کنید. محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند. تاریخ آخرین بهروزرسانی 2024-09-17 بهوقت ساعت هماهنگ جهانی. منابع اضافی
نمونه ها
Codelabs
پست های وبلاگ