اطلاعات کاربردی برای ارتقاء دانش XML در اندروید استودیو

آشنایی با امکانات فضای نام tools در Android Studio برگرفته از وبلاگ دوست عزیزم آقای مسعود فلاح‌پورقبل از شروع مطلب این موضوع رو ذکر کنم که در ادامه از معادل های فارسی زیر استفاده می‌کنم:فضای نام = name spaceخصیصه = attributeفضای نام tools یکی از اون مواردی هست که معمولا برنامه‌نویسای اندروید ازش استفاده نمیکنن در حالیکه امکانات جالبی داره. کاربرد اصلی این فضای نام، زمان طراحی layout هستش. اما بعضی از امکاناتش تو فایل‌های دیگه XML مثل strings.xml استفاده میشه.تو این پست به تعدادی از امکانات پرکاربرد این فضای نام اشاره میکنم. برای آشنایی با تمام امکانات این فضای نام میتونید به منابعی که انتهای همین پست قرار دادم مراجعه کنید.یک مثال از کاربرد فضای نام tools میزنم و بعد میریم سراغ اصل مطلب. فرض کنید توی یک layout یک TextView وجود داره و متن این TextView موقع طراحی مشخص نیست و موقع اجرا، از سرور گرفته میشه. حالا برای اینکه یک متن رو به صورت تستی داخل این TextView نمایش بدیم تا ظاهر، محل قرارگیری و موارد دیگه رو چک کنیم دو تا راه داریم:استفاده از خصیصه android:text. مشکل این روش اینه که اگر به هر دلیلی موقع اجرای برنامه، متنی که باید تو TextView نمایش داده بشه از سرور دریافت نشه (حالا به هر دلیلی) اونوقت اون متن تستی به کاربر نمایش داده میشه. حالا فکر کنید اون متن یه چیز ناجور باشه! در این صورت خیلی بد میشه.استفاده از خصیصه tools:text. وقتی از این خصیصه استفاده بشه موقع طراحی layout متن مورد نظر شما نمایش داده میشه اما این متن موقع اجرای اپ نمایش داده نمیشه و مشکلی که بالا بهش اشاره شد حل میشه.اضافه کردن فضای نام toolsبرای اینکه بتونیم از امکانات فضای نام tools استفاده کنیم باید این فضای نام رو به صورت زیر به بالاترین (یا به عبارت دیگه خارجی ترین) تگ داخل یک فایل XML اضافه کنیم.<RootTag xmlns:tools=&quothttp://schemas.android.com/tools&quot >منظور از RootTag، بالاترین تگ داخل فایل XML هستش.خصیصه‌های مربوط به کنترل خطاخصیصه tools:ignoreاین خصیصه توسط Lint مورد استفاده قرار میگیره و تو تمام تگ های XML میشه ازش استفاده کرد.با استفاده از این خصیصه میتونیم به Lint بگیم که یک سری اخطارها در مورد یک تگ رو نادیده بگیره. مثلا اگر شما داخل یک فایل layout از تگ ImageView استفاده کنید و خصیصه android:contentDescription رو وارد نکرده باشید Lint اخطار زیر رو نمایش میده.Missing contentDescription attribute on imageحالا برای اینکه به Lint بگیم این اخطار رو نادیده بگیر باید خصیصه tools:ignore رو به صورت زیر به ImageView اضافه کنیم.tools:ignore="ContentDescription"اگر نیاز دارید بیشتر از یک اخطار نادیده گرفته بشه باید لیست اون اخطارها رو به صورت جداشده با ویرگول از هم به صورت زیر وارد کنید.tools:ignore="ContentDescription, MissingTranslation"خصیصه tools:targetApiمثل خصیصه قبلی، این خصیصه هم توسط 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"خصیصه tools:localeاندروید استودیو به صورت پیش فرض زبان تمام اپ ها رو انگلیسی در نظر میگیره. حالا فرض کنید زبان اصلی اپ شما فارسی هستش و در نتیجه متنهای داخل فایل strings.xml فارسی خواهد بود. توی این حالت ممکنه Lint یه سری اخطارهای بی مورد نمایش بده چون خبر نداره که شما متنهای داخل strings.xml رو به زبانی غیر از انگلیسی نوشتید. برای اینکه به Lint بگیم زبان این فایل فارسی هستش باید به صورت زیر از خصیصه tools:locale استفاده کنیم.<resources xmlns:tools="http://schemas.android.com/tools"tools:locale="fa">خصیصه‌های مربوط به زمان طراحی layoutخصیصه‌های این قسمت فقط زمان طراحی layout تو اندروید استودیو اعمال میشن و در زمان اجرا نادیده گرفته میشن.ا- tools: به جای androidبه طور کلی هر جا که شما یک view تعریف کردید (مثلا TextView یا EditText و سایر viewها) و خصیصه‌ای رو ست کردید که با android: شروع میشه میتونید به جای android: از tools: استفاده کنید. با این کار خصیصه مورد نظر فقط تو حالت layout preview اعمال میشه و وقتی اپ روی امولاتور یا یک دستگاه اندرویدی اجرا بشه دیگه اون خصیصه‌ها اعمال نمیشن.برای مثال فرض کنید یک layout داریم که شامل چنتا view هستش. موقع اجرای اپ یکی از این viewها باید invisible باشه اما زمان طراحی layout میخوایم اون view رو ببینیم. تو چنین حالتی باید خصیصه visibility رو به صورت زیر ست کنیم.<Viewtools:visibility="visible"android:visibility="invisible"/>خصیصه tools:contextبا استفاده از این خصیصه تعیین میکنیم که 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 مشخص شده هستش. این موضوع تو شکل زیر نشون داده شده.خصیصه tools:itemCountخصیصه tools:itemCountاین خصیصه مربوط به RecyclerView هستش. اگر یک RecyclerView رو به یک layout اضافه کنید و تو layout preview اون layout رو ببینید متوجه میشید که اندروید استودیو به صورت پیش فرض تعدادی سطر رو به صورت تستی داخل RecyclerView نمایش میده. تعداد این سطرها به صورت پیش فرض ۱۰ تا هست. با استفاده از خصیصه tools:itemCount میتونید تعداد سطرها رو تعیین کنید. مثلا بگید به جای ۱۰ سطر، ۴ سطر نمایش داده بشه.خصیصه tools:layoutاز این خصیصه برای تگ fragment استفاده میشه. به وسیله این خصیصه میتونیم تعیین کنیم که تو layout preview کدوم layout به عنوان layout یک fragment نمایش داده بشه. برای این کار باید از خصیصه tools:layout به شکل زیر استفاده کنیم.<fragmentandroid:id="@+id/fragment"android:layout_width="match_parent"android:layout_height="match_parent"tools:layout="@layout/fragment_layout" />خصیصه‌های tools:listitem, tools:listheader, tools:listfooterاین سه تا خصیصه برای کلاس AdapterView (و کلاسهای مشتق از اون مثل ListView) کاربرد داره.وقتی یک ListView رو به یک layout اضافه کنید چندتا سطر به صورت تستی داخل ListView نمایش داده میشه. حالا اگر شما بخواید به جای اون سطرهای تستی سطر مورد نظر شما نمایش داده بشه باید از خصیصه tools:listitem استفاده کنید و layout مورد نظرتون که میخواید به عنوان هر سطر از ListView نمایش داده بشه رو وارد کنید. تو شکل زیر میتونید تفاوت بین حالتی که از خصیصه tools:listitem استفاده شده (شکل سمت راست) و حالتی که از این خصیصه استفاده نشده (شکل سمت چپ) رو ببینید.?خصیصه‌های tools:listheader و tools:listfooter هم کاربرد مشابه tools:listitem دارن و از اونها به ترتیب برای تعیین layout سرصفحه و پاصفحه استفاده میشه.خصیصه tools:showInفرض کنید یک 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"خصیصه tools:menuاگر شما داخل یک 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به کمک خصیصه tools:openDrawer میتونیم وضعیت باز یا بسته بودن یک DrawerLayout رو تو layout preview مشخص کنیم. مقادیری که این خصیصه میتونه داشته باشه عبارت‌اند از:endleftrightstartبه استفاده از مقادیر بالا میتونیم تعیین کنیم DrawerLayout تو layout preview از کدوم سمت صفحه به صورت باز شده نشون داده بشه.متن و عکس تستیاگر در جایی از یک layout نیاز به متن یا عکس تستی داشتید میتونید از resourceهایی که به صورت پیش‌فرض تعریف شده هستند استفاده کنید. بعضی از این resourceها عبارت‌اند از:tools:sample/first_name: یک نام تصادفی نمایش میدهtools:sample/last_name: یک نام خانوادگی تصادفی نمایش میدهtools:sample/full_names: یک نام و نام خانوادگی تصادفی نمایش میدهtools:sample/avatars: یک عکس پروفایل تصادفی که به صورت vector هست نمایش میدهtools:sample/backgrounds/scenic: یک عکس تصادفی که به عنوان پس‌زمینه میشه ازش استفاده کرد.فرض کنید داخل یک 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" />خصیصه‌های مربوط به کاهش حجم resourceهاتعدادی خصیصه تو فضای نام tools وجود دارن که از اونها برای کنترل shrink شدن یا نشدن resourceها استفاده میشه. این خصیصه‌ها عبارت‌اند از:tools:shrinkModetools:keeptools:discardبرای اطلاع از کاربرد هر کدوم از خصیصه‌های بالا میتونید به منابع انتهای پست مراجعه کنید.دسترسی به اپ تستیبرای آشنایی بیشتر با روش استفاده از هر کدوم از خصیصه‌های مطرح شده یک اپ تستی آماده کردم و روی گیت‌هاب قرار دادم. برای دسترسی به اپ میتونید از این لینک استفاده کنید.