خصوصیت های پنهان tools در اندروید استودیو — راهنمای کاربردی

۲۴۵ بازدید
آخرین به‌روزرسانی: ۱۲ مهر ۱۴۰۲
زمان مطالعه: ۹ دقیقه
خصوصیت های پنهان tools در اندروید استودیو — راهنمای کاربردی

احتمالاً بیشتر شما خوانندگان مجله فرادرس که این مطلب را برای مطالعه انتخاب کرده‌اید با خصوصیت‌های عجیب XML با پیشوند :tools در زمان طراحی لی‌آوت اپلیکیشن در اندروید استودیو کار کرده‌اید. اغلب ما از خصوصیت tools:text به طور مکرر در مواردی که متن باید به صورت دینامیک در زمان اجرا اضافه شود و از این رو استفاده از خصوصیت android:text میسر نیست استفاده می‌کنیم. در این راهنما می‌خواهیم اقدام به آشنایی با خصوصیات پنهان tools:‎ در اندروید استودیو بکنیم.

997696

با این حال رابطه اغلب ما با این ابزار قدرتمند فراتر از خصوصیت‌های tools:text, tools:visibility و tools:context نمی‌رود. اما بسیاری از موقعیت‌ها وجود دارند که تسلط داشتن روی این ابزار موجب می‌شود مشکلات حل شوند و از دوباره‌کاری‌های زیادی جلوگیری شود. بنابراین در این مقاله در مورد خصوصیت‌های tools صحبت می‌کنیم. در ادامه تلاش می‌کنیم درک بهتری از طرز کار این خصوصیت‌ها و کمکی که می‌توانند به ما در برنامه‌نویسی اندروید بکنند به دست آوریم.

مرور کلی

قبل از هر چیز و پیش از آن که وارد جزییات tools بشویم، باید یک مرور کلی روی خصوصیت‌های tools داشته باشیم و شیوه استفاده از آن‌ها را توضیح دهیم.

به بیان کلی خصوصیت‌های tools، در واقع خصوصیات XML خاصی هستند که نه تنها ویژگی‌های زمان طراحی (مانند این که کدام لی‌آوت باید درون فرگمان رسم شود) را در اختیار ما قرار می‌دهند، بلکه رفتارهای زمان کامپایل مانند سرکوب هشدارهای lint را نیز کنترل می‌کنند.

بر اساس راهنمای کاربری رسمی، این خصوصیات تنها از سوی اندروید استودیو استفاده شده و در زمان build اپلیکیشن از سوی build tools حذف می‌شوند. بنابراین استفاده از این خصوصیت‌ها تأثیری روی اندازه APK و رفتار زمان اجرا ندارد.

برای استفاده از این خصوصیت‌ها فضای نام tools باید به عنصر ریشه فایل xml چنان که در زیر نمایش یافته اضافه شود:

1<RootTag xmlns:android=”http://schemas.android.com/apk/res/android"
2xmlns:tools=”http://schemas.android.com/tools" >

بر اساس تابعی که خصوصیت اجرا می‌کند، می‌توانیم خصوصیت‌های tools را به سه دسته تقسیم کنیم:

1. خصوصیت‌های مدیریت خطا

برای سرکوب پیام‌های هشدار lint استفاده می‌شود. این دسته شامل خصوصیت‌های زیر است.

tools:ignore

برای هر عنصر استفاده می‌شود و هشدارهای lint را سرکوب می‌کند. می‌توان یک لیست جداشده با کاما از ID-های مشکلات lint به آن ارائه کرد که باید روی یک عنصر خاص یا هر یک از فرزندان آن نادیده گرفته شوند. برای نمونه می‌توان به صورت زیر اندروید استودیو را الزام کرد که فقدان توصیف محتوای <ImageView> را نادیده بگیرد:

1<ImageView
2    android:layout_width="@dimen/error_image_width"
3    android:layout_height="@dimen/error_image_height"
4    android:src="@drawable/ic_person_off" 
5    tools:ignore="ContentDescription"/>

tools:targetApi

برای هر عنصری استفاده می‌شود و سطح API را (به صورت عدد صحیح یا نام کد) که از این عنصر پشتیبانی می‌کند، نشان می‌دهد. این خصوصیت همانند حاشیه‌نویسی (annotation) به نام TargetApi@ در جاوا کار می‌کند. برای نمونه می‌توانید از کد زیر استفاده کنید زیرا android:elevation تنها روی API سطح 21 یا بالاتر موجود است اما می‌دانید که این لی‌آوت برای نسخه‌های API پایین‌تر موجود نیست:

1<Button
2    android:layout_width="wrap_content"
3    android:layout_height="wrap_content"
4    android:elevation="4dp"
5    tools:targetApi="lollipop"/>

tools:locale

برای resource-ها استفاده می‌شود و کاربرد آن نمایش زبان ‎/locale پیش‌فرض برای عنصر <resources> ارائه شده است تا از هشدارهای غلط‌یاب املایی جلوگیری کند. برای مثال، می‌توان این خصوصیت را به فایل values/strings.xml (مقادیر رشته‌ای پیش‌فرض) اضافه کرد تا مشخص شود که زبان پیش‌فرض رشته‌ها به جای انگلیسی اسپانیولی است:

1<resources xmlns:tools="http://schemas.android.com/tools"
2    tools:locale="es">

2. خصوصیت‌های Resource Shrinking

این خصوصیت‌ها امکان بررسی ارجاع صریح را هنگام استفاده از resource shrinking فراهم می‌سازند. این دسته شامل خصوصیت‌های زیر است:

tools:shrinkMode

به منظور منابع استفاده می‌شود و نشان می‌دهد که در حالت shrink هستیم. حالت پیش‌فرض shrink به صورت «حالت امن» (Safe Mode) است. برای استفاده از حالت strict باید عبارت "shrinkMode="strict را به تگ <resources> مانند زیر اضافه کنید:

1<resources xmlns:tools="http://schemas.android.com/tools"
2    tools:shrinkMode="strict" />

tools:keep

برای منابع استفاده می‌شود و هدف از آن تعیین دستی منبع‌هایی است که باید در طی خلاصه‌سازی منابع از حذف آن‌ها جلوگیری شود. به طور معمول این خصوصیت زمانی استفاده می‌شود که یک منبع به روش غیرمستقیم در زمان اجرا مورد ارجاع قرار گرفته باشد. برای حفظ دستی منابع باید یک فایل XML در همان دایرکتوری منابع (res/raw/keep.xml) ایجاد کنید و در آن تگ <resources> و همچنین هر منبعی که باید حفظ شود را با خصوصیت tools:keep به صورت یک لیست جدا شده با کاما وارد کنید. همچنین می‌توانید از یک کاراکتر ستاره به عنوان وایلدکارد استفاده کنید. به مثال زیر توجه کنید:

1<?xml version="1.0" encoding="utf-8"?>
2<resources xmlns:tools="http://schemas.android.com/tools"
3    tools:keep="@layout/used_1,@layout/used_2,@layout/*_3" />

tools:discard

برای منابع استفاده می‌شود و به صورت دستی منابعی که باید در زمان خلاصه‌سازی منابع حتماً حذف شوند در آن تعیین می‌کند. این کار عموماً در مورد منابعی صورت می‌گیرد که مورد ارجاع قرار گرفته‌اند، اما روش ارجاع آن‌ها اپلیکیشن را تحت تأثیر قرار نمی‌دهد یا چون افزونه Gradle به صورت نادرستی نتیجه‌گیری کرده است که منبع مورد ارجاع قرار گرفته است. کاربرد این خصوصیت همانند کاربردی خصوصیت tools:keep است:

1<?xml version="1.0" encoding="utf-8"?>
2<resources xmlns:tools="http://schemas.android.com/tools"
3    tools:discard="@layout/unused_1" />

3. خصوصیت‌های View زمان طراحی

این موارد برای تعریف مشخصه‌های لی‌آوت استفاده می‌شوند که تنها در پنل پیش‌نمایش اندروید استودیو قابل مشاهده هستند. به بیان دیگر این خصوصیت‌ها امکان تغییر دادن رندرینگ لی‌آوت در اندروید استودیو را بدون تأثیرگذاری بر Build در اختیار ما قرار می‌دهند.

در بخش بعدی این مورد را به تفصیل مورد بررسی قرار می‌دهیم.

این دسته عمده‌ای از خصوصیت tools است و در این مقاله روی آن متمرکز می‌شویم. علاوه بر توضیح همه خصوصیت‌های زمان طراحی می‌خواهیم برخی مثال‌های عملی نیز بر مبنای یک اپلیکیشن مخاطبین ساده که آن را ‎+Contacts می‌نامیم ارائه کنیم.

استفاده از :tools به جای :android

جایگزینی پیشوند :android به جای پیشوند :tools روی هر خصوصیت <View> به ما امکان می‌دهد که داده‌های نمونه را در پیش‌نمایش لی‌آوت خود وارد کنیم و همچنینی خصوصیت را تنها در پیش‌نمایش لی‌آوت غیرفعال نماییم. اگر به خصوصیت‌های tools:text و tools:visibility که در ابتدای مقاله اشاره کردیم توجه کرده باشید، متوجه می‌شوید که این خصوصیت‌ها به این دسته تعلق دارند و مقدار خصوصیت تا زمان اجرا مقداردهی نمی‌شود، اما اگر برای نمایش جلوه پیش از اجرا و در مرحله پیش‌نمایش لی‌آوت استفاده شود بسیار مفید خواهد بود.

این خصوصیت‌ها را روی لی‌آوت contact_item.xml که طرح‌بندی آیتم منفرد مخاطبین را در اپلیکیشن Contacts+ ما تعریف می‌کند امتحان می‌کنیم. در ادامه می‌توانید پیش‌نمایش و کد پیش‌نمایش کنونی این طرح‌بندی را ببینید:

1<?xml version="1.0" encoding="utf-8"?>
2<android.support.v7.widget.CardView
3    xmlns:android="http://schemas.android.com/apk/res/android"
4    xmlns:app="http://schemas.android.com/apk/res-auto"
5    xmlns:tools="http://schemas.android.com/tools"
6    android:id="@+id/contact_card_view"
7    android:layout_gravity="center"
8    android:layout_width="match_parent"
9    android:layout_height="wrap_content"
10    app:cardCornerRadius="9dp"
11    android:clickable="true"
12    android:focusable="true"
13    app:cardElevation="3dp"
14    android:padding="16dp"
15    app:cardUseCompatPadding="true"
16    android:foreground="?attr/selectableItemBackground">
17
18    <android.support.constraint.ConstraintLayout
19        android:layout_width="match_parent"
20        android:layout_height="wrap_content"
21        android:layout_margin="8dp">
22
23        <ImageView
24            android:id="@+id/avatar_image"
25            android:layout_width="38dp"
26            android:layout_height="38dp"
27            android:contentDescription="User avatar"
28            android:scaleType="centerCrop"
29            tools:src="@drawable/ic_face_male"
30            app:layout_constraintTop_toTopOf="parent"
31            android:layout_marginLeft="8dp"
32            android:layout_marginStart="8dp"
33            app:layout_constraintLeft_toLeftOf="parent"
34            tools:ignore="HardcodedText"/>
35
36        <TextView
37            android:id="@+id/contact_name_textview"
38            android:layout_width="wrap_content"
39            android:layout_height="wrap_content"
40            android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
41            app:layout_constraintLeft_toRightOf="@+id/avatar_image"
42            android:layout_marginLeft="8dp"
43            android:layout_marginStart="8dp"
44            tools:text="John Doe"
45            app:layout_constraintTop_toTopOf="parent"/>
46
47        <TextView
48            android:id="@+id/contact_mobile_number_static_textview"
49            android:layout_width="wrap_content"
50            android:layout_height="wrap_content"
51            android:textAppearance="@style/TextAppearance.AppCompat.Body1"
52            android:textColor="@color/colorSecondaryText"
53            android:text="@string/mobile_number_static_text"
54            android:layout_marginTop="8dp"
55            app:layout_constraintTop_toBottomOf="@+id/contact_name_textview"
56            app:layout_constraintLeft_toRightOf="@+id/avatar_image"
57            android:layout_marginLeft="8dp"
58            android:layout_marginStart="8dp"/>
59
60        <TextView
61            android:id="@+id/contact_mobile_number_textview"
62            android:layout_width="wrap_content"
63            android:layout_height="16dp"
64            android:textAppearance="@style/TextAppearance.AppCompat.Body1"
65            android:textColor="@color/colorSecondaryText"
66            tools:text="(800) 555-7150"
67            android:layout_marginTop="8dp"
68            app:layout_constraintTop_toBottomOf="@+id/contact_name_textview"
69            app:layout_constraintLeft_toRightOf="@+id/contact_mobile_number_static_textview"
70            android:layout_marginLeft="@dimen/contact_item_static_textview_margin"
71            android:layout_marginStart="@dimen/contact_item_static_textview_margin"/>
72
73        <TextView
74            android:id="@+id/contact_home_number_static_textview"
75            android:layout_width="wrap_content"
76            android:layout_height="wrap_content"
77            android:textAppearance="@style/TextAppearance.AppCompat.Body1"
78            android:textColor="@color/colorSecondaryText"
79            android:text="@string/home_number_static_text"
80            android:layout_marginTop="8dp"
81            app:layout_constraintTop_toBottomOf="@+id/contact_mobile_number_static_textview"
82            app:layout_constraintLeft_toRightOf="@+id/avatar_image"
83            android:layout_marginLeft="8dp"
84            android:layout_marginStart="8dp"/>
85
86        <TextView
87            android:id="@+id/contact_home_number_textview"
88            android:layout_width="wrap_content"
89            android:layout_height="wrap_content"
90            android:textAppearance="@style/TextAppearance.AppCompat.Body1"
91            android:textColor="@color/colorSecondaryText"
92            tools:text="(800) 555-7150"
93            android:layout_marginTop="8dp"
94            app:layout_constraintTop_toBottomOf="@+id/contact_mobile_number_textview"
95            app:layout_constraintLeft_toRightOf="@+id/contact_home_number_static_textview"
96            android:layout_marginLeft="8dp"
97            android:layout_marginStart="8dp"/>
98
99        <TextView
100            android:id="@+id/contact_office_number_static_textview"
101            android:layout_width="wrap_content"
102            android:layout_height="wrap_content"
103            android:textAppearance="@style/TextAppearance.AppCompat.Body1"
104            android:textColor="@color/colorSecondaryText"
105            android:text="@string/office_number_static_text"
106            android:layout_marginTop="8dp"
107            app:layout_constraintTop_toBottomOf="@+id/contact_home_number_textview"
108            app:layout_constraintLeft_toRightOf="@+id/avatar_image"
109            android:layout_marginLeft="8dp"
110            android:layout_marginStart="8dp"/>
111
112        <TextView
113            android:id="@+id/contact_office_number_textview"
114            android:layout_width="wrap_content"
115            android:layout_height="wrap_content"
116            android:textAppearance="@style/TextAppearance.AppCompat.Body1"
117            android:textColor="@color/colorSecondaryText"
118            tools:text="(800) 555-7150"
119            android:layout_marginTop="8dp"
120            app:layout_constraintTop_toBottomOf="@+id/contact_home_number_textview"
121            app:layout_constraintLeft_toRightOf="@+id/contact_office_number_static_textview"
122            android:layout_marginLeft="8dp"
123            android:layout_marginStart="8dp"/>
124
125        <TextView
126            android:id="@+id/contact_email_static_textview"
127            android:layout_width="wrap_content"
128            android:layout_height="wrap_content"
129            android:textAppearance="@style/TextAppearance.AppCompat.Body1"
130            android:textColor="@color/colorSecondaryText"
131            android:text="@string/email_static_text"
132            android:layout_marginTop="8dp"
133            app:layout_constraintTop_toBottomOf="@+id/contact_office_number_static_textview"
134            app:layout_constraintLeft_toRightOf="@+id/avatar_image"
135            android:layout_marginLeft="8dp"
136            android:layout_marginStart="8dp"/>
137
138        <TextView
139            android:id="@+id/contact_email_textview"
140            android:layout_width="wrap_content"
141            android:layout_height="wrap_content"
142            android:textAppearance="@style/TextAppearance.AppCompat.Body1"
143            android:textColor="@color/colorSecondaryText"
144            tools:text="john.doe@mail.com"
145            android:layout_marginTop="8dp"
146            app:layout_constraintTop_toBottomOf="@+id/contact_office_number_textview"
147            app:layout_constraintLeft_toRightOf="@+id/contact_email_static_textview"
148            android:layout_marginLeft="8dp"
149            android:layout_marginStart="8dp"/>
150
151        <TextView
152            android:id="@+id/contact_address_static_textview"
153            android:layout_width="wrap_content"
154            android:layout_height="wrap_content"
155            android:textAppearance="@style/TextAppearance.AppCompat.Body1"
156            android:textColor="@color/colorSecondaryText"
157            android:text="@string/address_static_text"
158            android:layout_marginTop="8dp"
159            app:layout_constraintTop_toBottomOf="@+id/contact_email_static_textview"
160            app:layout_constraintLeft_toRightOf="@+id/avatar_image"
161            android:layout_marginLeft="8dp"
162            android:layout_marginStart="8dp"/>
163
164        <TextView
165            android:id="@+id/contact_address_textview"
166            android:layout_width="wrap_content"
167            android:layout_height="wrap_content"
168            android:textAppearance="@style/TextAppearance.AppCompat.Body1"
169            android:textColor="@color/colorSecondaryText"
170            tools:text="San-Fransisco, US"
171            android:layout_marginTop="8dp"
172            app:layout_constraintTop_toBottomOf="@+id/contact_email_textview"
173            app:layout_constraintLeft_toRightOf="@+id/contact_address_static_textview"
174            android:layout_marginLeft="8dp"
175            android:layout_marginStart="8dp"/>
176
177        <android.support.v7.widget.AppCompatImageButton
178            android:id="@+id/favourite_button"
179            android:layout_width="38dp"
180            android:layout_height="38dp"
181            android:src="@drawable/ic_star_empty_green"
182            android:background="?selectableItemBackground"
183            android:layout_marginRight="4dp"
184            android:layout_marginEnd="4dp"
185            app:layout_constraintRight_toLeftOf="@+id/divider_line"
186            app:layout_constraintTop_toTopOf="parent"
187            android:layout_marginLeft="8dp"
188            android:layout_marginStart="8dp"/>
189
190        <View
191            android:id="@+id/divider_line"
192            android:layout_height="38dp"
193            android:layout_width="1dp"
194            android:background="@color/colorSecondaryText"
195            android:layout_marginStart="4dp"
196            android:layout_marginLeft="4dp"
197            app:layout_constraintTop_toTopOf="parent"
198            app:layout_constraintRight_toLeftOf="@+id/call_button"
199            android:layout_marginRight="@dimen/contact_item_divider_margin"
200            android:layout_marginEnd="@dimen/contact_item_divider_margin"/>
201
202        <android.support.v7.widget.AppCompatImageButton
203            android:id="@+id/call_button"
204            android:layout_width="38dp"
205            android:layout_height="38dp"
206            android:src="@drawable/ic_phone"
207            android:background="?selectableItemBackground"
208            android:layout_marginRight="8dp"
209            android:layout_marginEnd="8dp"
210            app:layout_constraintRight_toRightOf="parent"
211            app:layout_constraintTop_toTopOf="parent"
212            android:layout_marginStart="4dp"
213            android:layout_marginLeft="4dp"/>
214
215    </android.support.constraint.ConstraintLayout>
216
217</android.support.v7.widget.CardView>

به خصوصیت‌های tools:text در عناصر <TextView> و خصوصیت tools:src در عنصر <ImageView> توجه کنید. ما به این جهت از این خصوصیت استفاده می‌کنیم که هم داده‌ها در طی زمان اجرا از دیتابیس یا API بازیابی می‌شوند و هم در عناصر View مرتبط نمایش پیدا می‌کنند. بدون استفاده از خصوصیت‌های tools آیتم کارت ما چیزی مانند زیر خواهد بود:

این وضعیت کمی سردرگم‌ کننده است. استفاده از خصوصیت‌های با پیشوند :tools امکان بصری‌سازی داده‌ها را در پیش‌نمایش لی‌آوت در اختیار ما قرار می‌دهند و می‌توانیم این طرح‌بندی را با دقت بیشتری تست کنیم.

همچنین می‌توانیم از خصوصیت‌های با پیشوند :tools برای حذف یک خصوصیت با پیشوند :android تنها از پیش‌نمایش لی‌آوت استفاده کنیم. برای نمونه فرض کنید که می‌خواهیم آیتم‌های مخاطبان ما تنها نام و شماره همراه مخاطب را نمایش دهند و اطلاعات دیگر را در زمان کلیک کردن کاربر به نمایش بگذارند. برای فعال‌سازی این قابلیت کافی است ارتفاع <CardView> را روی 80dp تنظیم کنیم و شنونده onClick را طوری اضافه کنیم که اطلاعات ثانویه را باز کند.

چنان که می‌بینید پس از تعیین ارتفاع روی 80dp دیگر قادر به دیدن فیلدهای ثانویه در پیش‌نمایش لی‌آوت نیستیم. اما حل این مشکل بسیار ساده است. کافی است "tools:layout_height=”wrap_content را به <CardView> اضافه کنیم. این وضعیت بدان معنی نیز هست که امکان استفاده از هر دو خصوصیت فضای نام :android و خصوصیت‌های منطبق :tools به طور همزمان روی یک عنصر view وجود دارد.

tools:context

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

در مثال اپلیکیشن مخاطبان، این خصوصیت را به تگ ریشه فرگمان مخاطبان خود افزودیم، اما به این فرگمان اطلاع دهیم که در اکتیویتی اصلی اضافه خواهد شد.

1<RelativeLayout
2    xmlns:android="http://schemas.android.com/apk/res/android"
3    xmlns:tools="http://schemas.android.com/tools"
4    android:layout_width="match_parent"
5    android:layout_height="match_parent"
6    tools:context=".ui.activity.MainActivity">

tools:layout

این خصوصیت تنها از سوی تگ‌های <fragment> استفاده می‌شود و به ادیتور در مورد لی‌آوتی که باید از سوی پیش‌نمایش لی‌آوت، درون فرگمان رسم شود اطلاع می‌دهد. در ادامه تفاوت بین پیش‌نمایش‌های لی‌آوت فایل activity_main.xml را پیش و پس از افزودن عبارت "tools:layout=”@layout/fragment_contacts به تگ <fragment> می‌بینید:

1<?xml version="1.0" encoding="utf-8"?>
2<android.support.design.widget.CoordinatorLayout
3    xmlns:android="http://schemas.android.com/apk/res/android"
4    xmlns:app="http://schemas.android.com/apk/res-auto"
5    xmlns:tools="http://schemas.android.com/tools"
6    android:layout_width="match_parent"
7    android:layout_height="match_parent"
8    tools:context=".ui.activity.MainActivity">
9
10    <android.support.design.widget.AppBarLayout
11        android:layout_width="match_parent"
12        android:layout_height="wrap_content"
13        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
14
15        <android.support.v7.widget.Toolbar
16            android:id="@+id/toolbar"
17            android:layout_width="match_parent"
18            android:layout_height="?attr/actionBarSize"
19            app:layout_scrollFlags="scroll|enterAlways"
20            app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
21
22            <TextView
23                android:layout_width="wrap_content"
24                android:layout_height="wrap_content"
25                android:text="Contacts+"
26                android:textStyle="bold"
27                android:textSize="18sp"/>
28
29        </android.support.v7.widget.Toolbar>
30
31    </android.support.design.widget.AppBarLayout>
32
33    <fragment
34        android:id="@+id/home_fragment_container"
35        android:layout_width="match_parent"
36        android:layout_height="match_parent"
37        app:layout_behavior="@string/appbar_scrolling_view_behavior"
38        tools:layout="@layout/fragment_contacts"/>
39
40</android.support.design.widget.CoordinatorLayout>

tools:showIn

این خصوصیت برای اشاره به یک لی‌آوت استفاده می‌شود که از این لی‌آوت به عنوان یک include استفاده می‌کند و از طریق تگ <include> به آن اشاره می‌کند. این وضعیت به ما امکان می‌دهد که فایل را چنان که در زمان جاسازی در لی‌آوت والد خود دیده می‌شود ببینیم و ویرایش کنیم. برای نمونه افزودن "tools:showIn=”@layout/activity_main به تگ ریشه فایل contact_item.xml موجب می‌شود که ادیتور لی‌آوت ما را درون اکتیویتی اصلی از نو رسم کند:

tools:listitem | tools:listheader | tools:listfooter

این خصوصیت‌ها برای <AdapterView> و زیرکلاس‌های آن مانند <ListView> و <RecyclerView> استفاده می‌شوند و کاربردشان تعیین لی‌آوتی است که باید درون آن آداپتر به صورت یک آیتم لیست، هدر یا فوتر رسم شود. برای مثال لی‌آوت fragment_contacts_xml در اپلیکیشن ‎+Contacts ما یک <RecyclerView> اعلان می‌کند که پیش و پس از افزودن "tools:listitem=”@layout/contact_item به صورت زیر است:

1<?xml version="1.0" encoding="utf-8"?>
2<RelativeLayout
3    xmlns:android="http://schemas.android.com/apk/res/android"
4    xmlns:tools="http://schemas.android.com/tools"
5    xmlns:app="http://schemas.android.com/apk/res-auto"
6    android:id="@+id/contact_fragment_relative_layout"
7    android:layout_width="match_parent"
8    android:layout_height="match_parent"
9    tools:context=".ui.activity.MainActivity"
10    tools:showIn="@layout/activity_main">
11
12    <android.support.v7.widget.RecyclerView
13        android:id="@+id/recyclerview_contacts"
14        android:layout_width="match_parent"
15        android:layout_height="wrap_content"
16        android:gravity="center"
17        android:visibility="visible"
18        app:layoutManager="LinearLayoutManager"
19        tools:listitem="@layout/contact_item"/>
20
21</RelativeLayout>

tools:itemCount

این خصوصیت صرفاً برای <RecyclerView> استفاده می‌شود و جهت تعیین تعداد آیتم‌های لیست که ادیتور لی‌آوت باید در پیش‌نمایش لی‌آوت رندر کردن مورد استفاده قرار می‌گیرد.

بر اساس مشاهدات ما اندروید استودیو به صورت پیش‌فرض 10 آیتم لیست را برای <RecyclerView> نمایش می‌دهد. از این رو به صورت معمول با افزودن خصوصیت، <RecyclerView> کل صفحه لی‌آوت را پوشش می‌دهد و دیگر نمی‌توان عناصر زیر آن را دید. در این مواردی خصوصیت tools:itemCount به ما کمک می‌کند که عناصر زیر <RecyclerView> را ببینیم.

tools:menu

این خصوصیت برای تعیین لی‌آوت منویی استفاده می‌شود که باید در «نوار اپلیکیشن» (App Bar) دیده شود. لی‌آوت های منو باید بدون /menu@ با هر گونه پیشوند ID و بدون پسوند xml. اضافه شوند.

پس از افزودن به تگ ریشه activity_main.xml می‌توانیم آیکون منو را در نوار اپلیکیشن ببینیم:

بر اساس مستندات رسمی امکان ارسال چند ID منو که با کاما از هم جدا شده‌اند نیز به آن وجود دارد. با این حال ارسال آیتم‌های چندگانه منو هیچ تأثیری در پیش‌نمایش لی‌آوت ندارد.

tools:openDrawer

این خصوصیت منحصراً با <DrawerLayout> کار می‌کند و امکان کنترل حالت (باز، بسته) و یا موقعیت (چپ، راست) آن را در پنل پیش‌نمایش ادیتور لی‌آوت فراهم می‌سازد. در جدول زیر نام‌ها و توضیحات ثابت‌هایی را می‌بینید که این خصوصیت را به عنوان پارامتر می‌پذیرد:

برای نمونه کد زیر به ما امکان می‌دهد که <DrawerLayout> را در پنل پیش‌نمایش به صورت باز ببینیم:

1<android.support.v4.widget.DrawerLayout
2    xmlns:android="http://schemas.android.com/apk/res/android"
3    xmlns:tools="http://schemas.android.com/tools"
4    android:id="@+id/drawer_layout"
5    android:layout_width="match_parent"
6    android:layout_height="match_parent"
7    tools:openDrawer="start" />

tools:minValue | tools:maxValue

این خصوصیت مقادیر کمینه و بیشینه را برای <NumberPicker> در پنل پیش‌نمایش ادیتور لی‌آوت تنظیم می‌کند. برای مثال:

1<NumberPicker 
2    xmlns:android="http://schemas.android.com/apk/res/android"
3    xmlns:tools="http://schemas.android.com/tools"
4    android:id="@+id/numberPicker"
5    android:layout_width="match_parent"
6    android:layout_height="wrap_content"
7    tools:minValue="0"
8    tools:maxValue="10" />

منابع "*/tools:sample@"

این یکی از مفیدترین خصوصیت‌هایی است که به ما امکان می‌دهد داده‌های placeholder یا تصاویر را به view-ها تزریق کنیم. در حال حاضر اندروید استودیو انواع داده‌های از پیش تعریف شده زیر را پیشنهاد می‌کند که می‌توانند در عناصر View تزریق شوند:

در مورد اپلیکیشن ما یعنی +Contacts این داده‌های از پیش تعریف شده به ما امکان می‌دهند که نام، نام خانوادگی، شماره تلفن و نشانی و حتی آواتار مخاطبان را بدون استفاده از منابع متن و تصویر هاردکد شده بصری‌سازی کنیم.

اینک لی‌آوت ما واقع‌گرایانه‌تر به نظر می‌رسد. با این حال از آنجا که هیچ داده از پیش تعریف‌شده‌ای برای نشانی‌های ایمیل وجود ندارد، همچنان از متن هاردکد شده برای نمایش آن استفاده می‌کنیم. ضمناً به جای نشانی کامل صرفاً از "tools:sample/cities@" استفاده می‌کنیم که تنها نام شهرها را نمایش می‌دهد. خبر خوب این است که اینک اندروید استودیو 3 امکان ایجاد داده‌های نمونه از پیش تعریف شده را برای ما فراهم می‌سازد.

داده‌های نمونه

برای اعلان و استفاده از داده‌های نمونه قبل از هر چیز باید یک پوشه داده‌های نمونه ایجاد کنیم. به این منظور باید روی پوشه app راست-کلیک کرده و سپس گزینه New -> Sample Data directory را کلیک کنید.

خصوصیت های پنهان tools در اندروید استودیو

پس از آن متوجه می‌شوید که پوشه جدیدی به نام sampledata زیر دایرکتوری app ایجاد شده است. اکنون می‌توانید داده‌ها را درون این پوشه قرار دهید. در این زمان دو گزینه در اختیار ما قرار دارد:

افزودن فایل متنی ساده، درج داده‌های خارج به صورت خط به خط و سپس ارجاع دادن به آن با استفاده از "sample/fileName@". در مورد اپلیکیشن خودمان دو فایل به نام‌های emails و addresses ایجاد می‌کنیم و داده‌های ایمیل و نشانی را درون این فایل‌ها قرار می‌دهیم. سپس از فایل contact_item.xml با استفاده از "tools:text=”@sample/emails و "tools:text=”@sample/addresses به این داده‌ها ارجاع می‌دهیم.

خصوصیت های پنهان tools در اندروید استودیو

گزینه دوم که در پیش روی ما قرار دارد این است که یک فایل ایجاد کنیم و همه داده‌هایی را که نیاز داریم در قالب JSON در آن قرار دهیم و با استفاده از “sample/fileName.json/arrayName/fieldName@” به این داده‌ها ارجاع دهیم. این گزینه در مورد وجود داده‌های پیچیده نسبت به گزینه اول ترجیح دارد. در مورد اپلیکیشن خودمان یک فایل به نام sample.json با محتوای زیر ایجاد کردیم و با استفاده از "tools:text=”@sample/sample.json/data/email و "tools:text=”@sample/sample.json/data/address به فیلدها ارجاع دادیم.

خصوصیت های پنهان tools در اندروید استودیو

سخن پایانی

در این مقاله از طریق ساخت یک اپلیکیشن نمونه، به معرفی گزینه‌های tools در اندروید استودیو پرداختیم. اپلیکیشن ما پس از همه تغییرات، ظاهری بسیار زیبا و واقع‌گرایانه یافته است:

صوصیت های پنهان tools در اندروید استودیو

امیدواریم این مقاله برای شما مفید و جذاب بوده باشد.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۳ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
android.jlelse
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *