برگرفته از وبلاگ دوست عزیزم آقای مسعود فلاحپور
قبل از شروع مطلب این موضوع رو ذکر کنم که در ادامه از معادل های فارسی زیر استفاده میکنم:
فضای نام tools یکی از اون مواردی هست که معمولا برنامهنویسای اندروید ازش استفاده نمیکنن در حالیکه امکانات جالبی داره. کاربرد اصلی این فضای نام، زمان طراحی layout هستش. اما بعضی از امکاناتش تو فایلهای دیگه XML مثل strings.xml استفاده میشه.
تو این پست به تعدادی از امکانات پرکاربرد این فضای نام اشاره میکنم. برای آشنایی با تمام امکانات این فضای نام میتونید به منابعی که انتهای همین پست قرار دادم مراجعه کنید.
یک مثال از کاربرد فضای نام tools میزنم و بعد میریم سراغ اصل مطلب. فرض کنید توی یک layout یک TextView وجود داره و متن این TextView موقع طراحی مشخص نیست و موقع اجرا، از سرور گرفته میشه. حالا برای اینکه یک متن رو به صورت تستی داخل این TextView نمایش بدیم تا ظاهر، محل قرارگیری و موارد دیگه رو چک کنیم دو تا راه داریم:
برای اینکه بتونیم از امکانات فضای نام tools استفاده کنیم باید این فضای نام رو به صورت زیر به بالاترین (یا به عبارت دیگه خارجی ترین) تگ داخل یک فایل XML اضافه کنیم.
<RootTag xmlns:tools="http://schemas.android.com/tools" >
منظور از RootTag، بالاترین تگ داخل فایل XML هستش.
این خصیصه توسط Lint مورد استفاده قرار میگیره و تو تمام تگ های XML میشه ازش استفاده کرد.
با استفاده از این خصیصه میتونیم به Lint بگیم که یک سری اخطارها در مورد یک تگ رو نادیده بگیره. مثلا اگر شما داخل یک فایل layout از تگ ImageView استفاده کنید و خصیصه android:contentDescription رو وارد نکرده باشید Lint اخطار زیر رو نمایش میده.
Missing contentDescription attribute on image
حالا برای اینکه به Lint بگیم این اخطار رو نادیده بگیر باید خصیصه tools:ignore رو به صورت زیر به ImageView اضافه کنیم.
tools:ignore="ContentDescription"
اگر نیاز دارید بیشتر از یک اخطار نادیده گرفته بشه باید لیست اون اخطارها رو به صورت جداشده با ویرگول از هم به صورت زیر وارد کنید.
tools:ignore="ContentDescription, MissingTranslation"
مثل خصیصه قبلی، این خصیصه هم توسط Lint مورد استفاده قرار میگیره و تو تمام تگ های XML کاربرد داره.
کاربرد این تگ دقیقا مثل @TargetApi هستش. در واقع میشه اینطوری گفت که tools:targetApi معادل XMLای @TargetApi هستش. کاربرد این خصیصه اینه که به Lint اعلام کنیم تگی که این خصیصه رو داره فقط و فقط روی یک API level خاص و بالاتر از اون استفاده خواهد شد و در نتیجه خطایی در اجرای اپ رخ نخواهد داد.
فرض کنید minSdkVersion پروژه شما ۱۲ باشه و شما از تگ GridLayout استفاده کردید. با توجه به اینکه GridLayout از API level شماره ۱۴ به بعد در دسترسه در نتیجه Lint اخطار زیر رو نمایش میده:
View requires API level 14
برای اینکه این اخطار رو حذف کنیم باید خصیصه tools:targetApi رو به صورت زیر به خصیصههای GridLayout اضافه کنیم.
tools:targetApi="14"
اندروید استودیو به صورت پیش فرض زبان تمام اپ ها رو انگلیسی در نظر میگیره. حالا فرض کنید زبان اصلی اپ شما فارسی هستش و در نتیجه متنهای داخل فایل strings.xml فارسی خواهد بود. توی این حالت ممکنه Lint یه سری اخطارهای بی مورد نمایش بده چون خبر نداره که شما متنهای داخل strings.xml رو به زبانی غیر از انگلیسی نوشتید. برای اینکه به Lint بگیم زبان این فایل فارسی هستش باید به صورت زیر از خصیصه tools:locale استفاده کنیم.
<resources xmlns:tools="http://schemas.android.com/tools"
tools:locale="fa">
خصیصههای این قسمت فقط زمان طراحی layout تو اندروید استودیو اعمال میشن و در زمان اجرا نادیده گرفته میشن.
ا- tools: به جای android
به طور کلی هر جا که شما یک view تعریف کردید (مثلا TextView یا EditText و سایر viewها) و خصیصهای رو ست کردید که با android: شروع میشه میتونید به جای android: از tools: استفاده کنید. با این کار خصیصه مورد نظر فقط تو حالت layout preview اعمال میشه و وقتی اپ روی امولاتور یا یک دستگاه اندرویدی اجرا بشه دیگه اون خصیصهها اعمال نمیشن.
برای مثال فرض کنید یک layout داریم که شامل چنتا view هستش. موقع اجرای اپ یکی از این viewها باید invisible باشه اما زمان طراحی layout میخوایم اون view رو ببینیم. تو چنین حالتی باید خصیصه visibility رو به صورت زیر ست کنیم.
<View
tools:visibility="visible"
android:visibility="invisible"/>
با استفاده از این خصیصه تعیین میکنیم که layout تعریف شده مربوط به کدوم activity هستش. برای استفاده از این خصیصه باید اون رو به خارجیترین تگ یک فایل layout به صورت زیر اضافه کنیم.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.activity.MainActivity">
مقدار خصیصه tools:context مسیر قرارگیری و نام activity مورد نظر خواهد بود.
کاربرد این خصیصه زمانی مشخص میشه که شما داخل layout نیاز به انجام کاری دارید و برای انجام اون کار Android Studio باید بدونه این layout مربوط به کدوم activity هستش.
برای مثال فرض کنید شما داخل layout یه button دارید و خصیصه اون رو ست کردید تا وقتی دکمه کلیک شد متدی به نام onButtonClicked فراخوانی بشه. حالا اگر شما خصیصه tools:context رو ست کرده باشید و activity مورد نظر رو تعریف کرده باشید Android Studio متوجه میشه که اگر قراره متد onButtonClicked تعریف بشه محل تعریفش داخل activity مشخص شده هستش. این موضوع تو شکل زیر نشون داده شده.
این خصیصه مربوط به RecyclerView هستش. اگر یک RecyclerView رو به یک layout اضافه کنید و تو layout preview اون layout رو ببینید متوجه میشید که اندروید استودیو به صورت پیش فرض تعدادی سطر رو به صورت تستی داخل RecyclerView نمایش میده. تعداد این سطرها به صورت پیش فرض ۱۰ تا هست. با استفاده از خصیصه tools:itemCount میتونید تعداد سطرها رو تعیین کنید. مثلا بگید به جای ۱۰ سطر، ۴ سطر نمایش داده بشه.
از این خصیصه برای تگ fragment استفاده میشه. به وسیله این خصیصه میتونیم تعیین کنیم که تو layout preview کدوم layout به عنوان layout یک fragment نمایش داده بشه. برای این کار باید از خصیصه tools:layout به شکل زیر استفاده کنیم.
<fragment
android:id="@+id/fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout="@layout/fragment_layout" />
این سه تا خصیصه برای کلاس AdapterView (و کلاسهای مشتق از اون مثل ListView) کاربرد داره.
وقتی یک ListView رو به یک layout اضافه کنید چندتا سطر به صورت تستی داخل ListView نمایش داده میشه. حالا اگر شما بخواید به جای اون سطرهای تستی سطر مورد نظر شما نمایش داده بشه باید از خصیصه tools:listitem استفاده کنید و layout مورد نظرتون که میخواید به عنوان هر سطر از ListView نمایش داده بشه رو وارد کنید. تو شکل زیر میتونید تفاوت بین حالتی که از خصیصه tools:listitem استفاده شده (شکل سمت راست) و حالتی که از این خصیصه استفاده نشده (شکل سمت چپ) رو ببینید.
?
خصیصههای tools:listheader و tools:listfooter هم کاربرد مشابه tools:listitem دارن و از اونها به ترتیب برای تعیین layout سرصفحه و پاصفحه استفاده میشه.
فرض کنید یک layout تعریف کردید به نام partial_layout و داخل یک layout دیگه به نام main_layout از partial_layout به کمک تگ include استفاده کردید. اگر خصیصه tools:showIn رو به خارجیترین تگ partial_layout اضافه کنید اونوقت تو layout preview میتونید partial_layout رو در حالیکه داخل main_layout داره نمایش داده میشه ببینید.
روش استفاده از خصیصه tools:showIn به صورت زیر هستش. در واقع باید خصیصه زیر رو به خارجیترین تگ فایل partial_layout اضافه کنید.
tools:showIn="@layout/main_layout"
اگر شما داخل یک layout یک app bar دارید که یک منو هم داره میتونیم با استفاده از خصیصه tools:menu تعیین کنیم که چه منویی تو layout preview نمایش داده بشه. خصیصه tools:menu باید به خارجیترین تگ layout اضافه بشه. اگر فرض کنیم خارجیترین تگ فایل layout یک LinearLayout باشه اونوقت باید از خصیصه tools:menu به شکل زیر استفاده کنیم:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:menu="menu1" />
تو قطعه کد بالا فرض شده menu1 نام یک menu resource هستش که داخل پوشه menu تعریف شده. نکتهای که وجود داره اینه که لازم نیست پیشوند @menu رو ابتدای menu1 بیاریم.
به کمک خصیصه tools:openDrawer میتونیم وضعیت باز یا بسته بودن یک DrawerLayout رو تو layout preview مشخص کنیم. مقادیری که این خصیصه میتونه داشته باشه عبارتاند از:
به استفاده از مقادیر بالا میتونیم تعیین کنیم DrawerLayout تو layout preview از کدوم سمت صفحه به صورت باز شده نشون داده بشه.
اگر در جایی از یک layout نیاز به متن یا عکس تستی داشتید میتونید از resourceهایی که به صورت پیشفرض تعریف شده هستند استفاده کنید. بعضی از این resourceها عبارتاند از:
فرض کنید داخل یک TextView بخوایم نام و نام خانوادگی تستی نمایش بدیم. برای این کار میتونیم به صورت زیر عمل کنیم.
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="@tools:sample/full_names" />
تعدادی خصیصه تو فضای نام tools وجود دارن که از اونها برای کنترل shrink شدن یا نشدن resourceها استفاده میشه. این خصیصهها عبارتاند از:
برای اطلاع از کاربرد هر کدوم از خصیصههای بالا میتونید به منابع انتهای پست مراجعه کنید.
برای آشنایی بیشتر با روش استفاده از هر کدوم از خصیصههای مطرح شده یک اپ تستی آماده کردم و روی گیتهاب قرار دادم. برای دسترسی به اپ میتونید از این لینک استفاده کنید.