خصوصیت های پنهان 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 چنان که در زیر نمایش یافته اضافه شود:
بر اساس تابعی که خصوصیت اجرا میکند، میتوانیم خصوصیتهای tools را به سه دسته تقسیم کنیم:
1. خصوصیتهای مدیریت خطا
برای سرکوب پیامهای هشدار lint استفاده میشود. این دسته شامل خصوصیتهای زیر است.
tools:ignore
برای هر عنصر استفاده میشود و هشدارهای lint را سرکوب میکند. میتوان یک لیست جداشده با کاما از ID-های مشکلات lint به آن ارائه کرد که باید روی یک عنصر خاص یا هر یک از فرزندان آن نادیده گرفته شوند. برای نمونه میتوان به صورت زیر اندروید استودیو را الزام کرد که فقدان توصیف محتوای <ImageView> را نادیده بگیرد:
tools:targetApi
برای هر عنصری استفاده میشود و سطح API را (به صورت عدد صحیح یا نام کد) که از این عنصر پشتیبانی میکند، نشان میدهد. این خصوصیت همانند حاشیهنویسی (annotation) به نام TargetApi@ در جاوا کار میکند. برای نمونه میتوانید از کد زیر استفاده کنید زیرا android:elevation تنها روی API سطح 21 یا بالاتر موجود است اما میدانید که این لیآوت برای نسخههای API پایینتر موجود نیست:
tools:locale
برای resource-ها استفاده میشود و کاربرد آن نمایش زبان /locale پیشفرض برای عنصر <resources> ارائه شده است تا از هشدارهای غلطیاب املایی جلوگیری کند. برای مثال، میتوان این خصوصیت را به فایل values/strings.xml (مقادیر رشتهای پیشفرض) اضافه کرد تا مشخص شود که زبان پیشفرض رشتهها به جای انگلیسی اسپانیولی است:
2. خصوصیتهای Resource Shrinking
این خصوصیتها امکان بررسی ارجاع صریح را هنگام استفاده از resource shrinking فراهم میسازند. این دسته شامل خصوصیتهای زیر است:
tools:shrinkMode
به منظور منابع استفاده میشود و نشان میدهد که در حالت shrink هستیم. حالت پیشفرض shrink به صورت «حالت امن» (Safe Mode) است. برای استفاده از حالت strict باید عبارت "shrinkMode="strict را به تگ <resources> مانند زیر اضافه کنید:
tools:keep
برای منابع استفاده میشود و هدف از آن تعیین دستی منبعهایی است که باید در طی خلاصهسازی منابع از حذف آنها جلوگیری شود. به طور معمول این خصوصیت زمانی استفاده میشود که یک منبع به روش غیرمستقیم در زمان اجرا مورد ارجاع قرار گرفته باشد. برای حفظ دستی منابع باید یک فایل XML در همان دایرکتوری منابع (res/raw/keep.xml) ایجاد کنید و در آن تگ <resources> و همچنین هر منبعی که باید حفظ شود را با خصوصیت tools:keep به صورت یک لیست جدا شده با کاما وارد کنید. همچنین میتوانید از یک کاراکتر ستاره به عنوان وایلدکارد استفاده کنید. به مثال زیر توجه کنید:
tools:discard
برای منابع استفاده میشود و به صورت دستی منابعی که باید در زمان خلاصهسازی منابع حتماً حذف شوند در آن تعیین میکند. این کار عموماً در مورد منابعی صورت میگیرد که مورد ارجاع قرار گرفتهاند، اما روش ارجاع آنها اپلیکیشن را تحت تأثیر قرار نمیدهد یا چون افزونه Gradle به صورت نادرستی نتیجهگیری کرده است که منبع مورد ارجاع قرار گرفته است. کاربرد این خصوصیت همانند کاربردی خصوصیت tools:keep است:
3. خصوصیتهای View زمان طراحی
این موارد برای تعریف مشخصههای لیآوت استفاده میشوند که تنها در پنل پیشنمایش اندروید استودیو قابل مشاهده هستند. به بیان دیگر این خصوصیتها امکان تغییر دادن رندرینگ لیآوت در اندروید استودیو را بدون تأثیرگذاری بر Build در اختیار ما قرار میدهند.
در بخش بعدی این مورد را به تفصیل مورد بررسی قرار میدهیم.
این دسته عمدهای از خصوصیت tools است و در این مقاله روی آن متمرکز میشویم. علاوه بر توضیح همه خصوصیتهای زمان طراحی میخواهیم برخی مثالهای عملی نیز بر مبنای یک اپلیکیشن مخاطبین ساده که آن را +Contacts مینامیم ارائه کنیم.
استفاده از :tools به جای :android
جایگزینی پیشوند :android به جای پیشوند :tools روی هر خصوصیت <View> به ما امکان میدهد که دادههای نمونه را در پیشنمایش لیآوت خود وارد کنیم و همچنینی خصوصیت را تنها در پیشنمایش لیآوت غیرفعال نماییم. اگر به خصوصیتهای tools:text و tools:visibility که در ابتدای مقاله اشاره کردیم توجه کرده باشید، متوجه میشوید که این خصوصیتها به این دسته تعلق دارند و مقدار خصوصیت تا زمان اجرا مقداردهی نمیشود، اما اگر برای نمایش جلوه پیش از اجرا و در مرحله پیشنمایش لیآوت استفاده شود بسیار مفید خواهد بود.
این خصوصیتها را روی لیآوت contact_item.xml که طرحبندی آیتم منفرد مخاطبین را در اپلیکیشن Contacts+ ما تعریف میکند امتحان میکنیم. در ادامه میتوانید پیشنمایش و کد پیشنمایش کنونی این طرحبندی را ببینید:
به خصوصیتهای 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 و مواردی از این دست در ادیتور یا پیشنمایش لیآوت فعال میشوند که نیازمند اطلاع از اکتیویتی هستند.
در مثال اپلیکیشن مخاطبان، این خصوصیت را به تگ ریشه فرگمان مخاطبان خود افزودیم، اما به این فرگمان اطلاع دهیم که در اکتیویتی اصلی اضافه خواهد شد.
tools:layout
این خصوصیت تنها از سوی تگهای <fragment> استفاده میشود و به ادیتور در مورد لیآوتی که باید از سوی پیشنمایش لیآوت، درون فرگمان رسم شود اطلاع میدهد. در ادامه تفاوت بین پیشنمایشهای لیآوت فایل activity_main.xml را پیش و پس از افزودن عبارت "tools:layout=”@layout/fragment_contacts به تگ <fragment> میبینید:
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 به صورت زیر است:
tools:itemCount
این خصوصیت صرفاً برای <RecyclerView> استفاده میشود و جهت تعیین تعداد آیتمهای لیست که ادیتور لیآوت باید در پیشنمایش لیآوت رندر کردن مورد استفاده قرار میگیرد.
بر اساس مشاهدات ما اندروید استودیو به صورت پیشفرض 10 آیتم لیست را برای <RecyclerView> نمایش میدهد. از این رو به صورت معمول با افزودن خصوصیت، <RecyclerView> کل صفحه لیآوت را پوشش میدهد و دیگر نمیتوان عناصر زیر آن را دید. در این مواردی خصوصیت tools:itemCount به ما کمک میکند که عناصر زیر <RecyclerView> را ببینیم.
tools:menu
این خصوصیت برای تعیین لیآوت منویی استفاده میشود که باید در «نوار اپلیکیشن» (App Bar) دیده شود. لیآوت های منو باید بدون /menu@ با هر گونه پیشوند ID و بدون پسوند xml. اضافه شوند.
پس از افزودن به تگ ریشه activity_main.xml میتوانیم آیکون منو را در نوار اپلیکیشن ببینیم:
بر اساس مستندات رسمی امکان ارسال چند ID منو که با کاما از هم جدا شدهاند نیز به آن وجود دارد. با این حال ارسال آیتمهای چندگانه منو هیچ تأثیری در پیشنمایش لیآوت ندارد.
tools:openDrawer
این خصوصیت منحصراً با <DrawerLayout> کار میکند و امکان کنترل حالت (باز، بسته) و یا موقعیت (چپ، راست) آن را در پنل پیشنمایش ادیتور لیآوت فراهم میسازد. در جدول زیر نامها و توضیحات ثابتهایی را میبینید که این خصوصیت را به عنوان پارامتر میپذیرد:
برای نمونه کد زیر به ما امکان میدهد که <DrawerLayout> را در پنل پیشنمایش به صورت باز ببینیم:
tools:minValue | tools:maxValue
این خصوصیت مقادیر کمینه و بیشینه را برای <NumberPicker> در پنل پیشنمایش ادیتور لیآوت تنظیم میکند. برای مثال:
منابع "*/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)
- مجموعه آموزشهای برنامهنویسی
- ۵ گام ضروری برای یادگیری برنامهنویسی اندروید — راهنمای جامع
- برنامهنویسی موبایل با اندروید استودیو
==