خصوصیت های پنهان tools در اندروید استودیو — راهنمای کاربردی
احتمالاً بیشتر شما خوانندگان مجله فرادرس که این مطلب را برای مطالعه انتخاب کردهاید با خصوصیتهای عجیب XML با پیشوند :tools در زمان طراحی لیآوت اپلیکیشن در اندروید استودیو کار کردهاید. اغلب ما از خصوصیت tools:text به طور مکرر در مواردی که متن باید به صورت دینامیک در زمان اجرا اضافه شود و از این رو استفاده از خصوصیت android:text میسر نیست استفاده میکنیم. در این راهنما میخواهیم اقدام به آشنایی با خصوصیات پنهان tools: در اندروید استودیو بکنیم.
با این حال رابطه اغلب ما با این ابزار قدرتمند فراتر از خصوصیتهای 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 را کلیک کنید.
پس از آن متوجه میشوید که پوشه جدیدی به نام sampledata زیر دایرکتوری app ایجاد شده است. اکنون میتوانید دادهها را درون این پوشه قرار دهید. در این زمان دو گزینه در اختیار ما قرار دارد:
افزودن فایل متنی ساده، درج دادههای خارج به صورت خط به خط و سپس ارجاع دادن به آن با استفاده از "sample/fileName@". در مورد اپلیکیشن خودمان دو فایل به نامهای emails و addresses ایجاد میکنیم و دادههای ایمیل و نشانی را درون این فایلها قرار میدهیم. سپس از فایل contact_item.xml با استفاده از "tools:text=”@sample/emails و "tools:text=”@sample/addresses به این دادهها ارجاع میدهیم.
گزینه دوم که در پیش روی ما قرار دارد این است که یک فایل ایجاد کنیم و همه دادههایی را که نیاز داریم در قالب JSON در آن قرار دهیم و با استفاده از “sample/fileName.json/arrayName/fieldName@” به این دادهها ارجاع دهیم. این گزینه در مورد وجود دادههای پیچیده نسبت به گزینه اول ترجیح دارد. در مورد اپلیکیشن خودمان یک فایل به نام sample.json با محتوای زیر ایجاد کردیم و با استفاده از "tools:text=”@sample/sample.json/data/email و "tools:text=”@sample/sample.json/data/address به فیلدها ارجاع دادیم.
سخن پایانی
در این مقاله از طریق ساخت یک اپلیکیشن نمونه، به معرفی گزینههای tools در اندروید استودیو پرداختیم. اپلیکیشن ما پس از همه تغییرات، ظاهری بسیار زیبا و واقعگرایانه یافته است:
امیدواریم این مقاله برای شما مفید و جذاب بوده باشد.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای پروژهمحور برنامهنویسی اندروید
- گنجینه برنامه نویسی اندروید (Android)
- مجموعه آموزشهای برنامهنویسی
- ۵ گام ضروری برای یادگیری برنامهنویسی اندروید — راهنمای جامع
- برنامهنویسی موبایل با اندروید استودیو
==