به نام خدا

اگه برنامه نویس اندروید هستید حتما خیلی از ویو هایی که توی محیط xml برای طراحی لایوت استفاده میشن رو میشناسید مثل LinearLayout یا ViewPager و خیلی چیزای دیگه اما یه سری از ویو ها هستن که شاید اصلا تا حالا اسمشونم به گوشتون نخورده باشه مثلا ViewSwitcher یا QuickContactBadge و چیزای دیگه که توی این پست قصد توضیح اونا رو داریم

 

  • requestFocus

این یه ویو نیست اما توی لایوت استفاده میشه و کاربردش زمانیه که شما چند تا ادیت تکست داشته باشید و همونجور که میدونید به محض باز شدن برنامه، کیبورد اندروید به صورت آماده روی اولین ادیت تکست فعال و آماده نوشتن میشه حالا شما نمیخواید کیبورد روی اون ادیت تکست باز شه و مثلا قصد دارید که ادیت تکست سوم برای نوشتن به صورت پیشفرض آماده باشه و مکان نما روی اون باشه. تنها کاری که میکنید اینه که ادیت تکست رو از حالت سلف کلوز (self close) خارج کنید یعنی اگه تگ ادیت تکست به این شکل نوشته شده:

<EditText
    android:id="@+id/et2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

شما باید به این شکل بنویسید

<EditText
    android:id="@+id/et2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
  ></EditText>

و در ادامه اون تگ requestFocus رو داخل دو این تگ قرار بدید یعنی به شکل زیر:

<EditText
    android:id="@+id/et2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <requestFocus />
</EditText>

حالا اگه برنامه رو اجرا کنید میبینید که اشاره گر به صورت اتوماتیک روی این ادیت تکست قرار گرفته

 

  • TableLayout

این ویو رو حتما شما توی برنامه هاتون استفاده کردید اما شاید نه به این شکل ولی حتما تا حالا یه لینر لایوت عمودی رو با چند تا لینرلایوت افقی پر کردید تا بتونید ویو ها رو کنار هم قرار بدید و در عین حال سایر ویو ها رو زیر اونا قرار بدید

اما توی این ویو شما میتونید همین کارو به شکل راحت تری (البته بازم به همون شکل) انجام بدید. یه نمای از این کد ها رو در زیر مشاهده میکنید:

<TableLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </TableLayout>

 

  •  ViewSwitcher - TextSwitcher - ImageSwticher

سه تا ویو که همشون هم از همون ویو اول یعنی ViewSwitcher ارث بری شده کار همشون اینه که دو تا ویو میگیرن که فقط ویو اول رو نمایش میدن و ویو دوم رو پنهان میکنن (توجه کنید که اگه بیشتر از دو تا ویو توش بزارید ارور Can’t add more than 2 views to a ViewSwitcher رو بهتون میده) 

کاربردشون جاهای مختلفی هست و کاربرد نسبتا متوسطی دارن مثلا یه زمانی هست که شما یه لیستی رو قراره نشون بدید اما میخواید اگه اون لیست خالی باشه اونو نشون ندید و به جاش یه متنی شامل "هیچ رویدادی وجود ندارد" را نشون بدید در این صورت شما یه لیست و یه تکست ویو رو میریزید توی این ویو سویچر و برنامه تون رو مینویسید هر موقع خواستید که بره روی اون ویو یعنی بره متن رو نشون بده کافیه از توابع زیر استفاده کنید

//نشان دادن ویو بعدی و پنهان کردن ویو فعلی
simpleViewSwitcher.showNext();
//نمایش ویو قبلی و پنهان کردن ویو فعلی
simpleViewSwitcher.showPrevious();
//نمایش ویو بر حسب مکان موجود در ویوسویچر (0 یا 1)
simpleViewSwitcher.setDisplayChild(1);

 

  • QuickContactBadge

یه ویو خیلی کم کاربرد که من از وقتی فهمیدم چنین چیزی وجود داره یه خورده شک کردم که واقعا کاربردش رو فهمیدم یا نه

تا حالا به کارم نیومده اما یه ویویی هست که کانتکتی رو که میخواید نشون میده و با کلیک روش یه صفحه ای باز میشه که یه سری اطلاعات رو از خود مخاطبین گوشی میگیره و نشون میده اگر کسی میدونه کاربردش چیه و میشه کجاها ازش استفاده کرد لطفا توی نظرات بنده رو راهنمایی کنه

 

  • GridLayout

یه ویو خوب برای چیدمان جدولی که با دیدن ویو هایی که باهاش میسازن من واقعا متعجب شدم میتونید سرچ کنید و ازش استفاده کنید من نتونستم زیاد روش وقت بزارم و خوب یاد بگیرمش اگه مطلبی رو آماده کردید و فکر میکنید بشه اینجا نوشتش همینجا نظر بدید و یه چند خطی راجع بهش بنویسید تا اینجا با متن خودم جایگزین کنم

 

  • ExpandableListView

اینو حتما دیدید و شایدم باهاش کار کرده باشید اما من ترجیح میدم که از لایبراری هایی که با ریسایکر ویو نوشته شدن و قابلیت گسترس (Expandable) رو دارن استفاده کنم چون دیگه کار ما از لیست ویو گذشت و متاسفانه این ویو از لیست ویو ارث بری شده.

 

  • SearchView

یه ویو خوب برای زمانی که میخواید یه فیلد برای سرچ بسازید. این ویو یه لینر لایوت که شامل یه ادیت تکست و یه ایمیج ویو هست اما خب یه توابعی رو در اختیارتون میزاره که اگه میخواستید اینا رو خودتون دستی بنویسید یکم کار میبرد و به تمرکز لازم داشت اما توی این ویو شما دو تا تابع خوب دارید

onQueryTextSubmit برای زمانی که شما میخواید وقتی کاربر دکمه سرچ روی کیبوردش رو میزنه صدا زده بشه و متن رو بهتون بده که خب زیاد چیز عجیبی نیست 

onQueryTextChange زمانی که کاربر داره متنش رو مینویسه این تابع به شما حرف به حرف رو میده و میتونید باهاش لیست یا هرچیزی رو که دارید فیلتر کنید

  • ViewFlipper

یه ویو که بیشتر شبیه به ویوپیجر هست با این تفاوت که با دست سوایپ نمیشه و بیشتر روی انیمیشن تمرکز داره  و به راحتی میشه باهاش اسلایدری که خودش تایم میگیره و تصاویر رو نشون میده ساخت و اگه یه موقع براتون سوال پیش اومد که تفاوتش با ویوسویچر چیه باید بگم که توی ویوسویچر ما فقط دو تا ویو میتونستیم بهش بدیم اما توی این هرچی بخوایم میتونیم بدیم اما خب حالت انیمیشن و تایمر داره و از ViewAnimator ارث بری شده 

ViewAnimator هم چنین کاری رو انجام میده اما توی ViewFlipper ما توابعی برای سوییچ خودکار به همراه تایمر داریم که توی ویو انیمیتور نداریم

  • StackView

از عجیب ترین ویو هایی که توی اندروید دیدم البته بعد از اون QuickContactBadge که خیلی کم کاربرد و کم استفاده است

این ویو همه چایلد ها رو به صورت استک و پشت سر هم میچینه همین شکل زیر یه نمونه از استک ویو هست

ُStackView

 

  • ViewStub

شاید تا حالا شده که شما یه فایل xml رو میسازید و میخواید توی چند تا از لایوت ها استفاده کنید مثلا یه هدر یا یه چیز دیگه، همیشه اینکارو میکردیم که اون فایل xml رو توی لایوت خودمون include میکردیم کار include اینه که تمامی xml رو میریزه جای تگ include و بنابراین توی لایوت نمایش میده

حالا شما ممکنه بخواید یه ویو رو بزارید بعد توی کد بگید مثلا اگه مدیر بود بهش این ویو رو نشون بده اگه کاربر بود این ویو رو نشون بده اما توی include- به صورت مستقیم فقط کپی میزنه 

چیزی رو که میخوام معرفی کنم ViewStub هست که یه ویو رو هم میتونه توی xml بگیره هم میتونه توی جاوا و محیط کد بگیره اما تفاوتی که داره اینه که تا وقتی inflate نشه اصلا ویوش رندر گرفته نمیشه و ساخته نمیشه پس شما حتما نیاز دارید که تابع inflate() رو به شکل زیر صدا بزنید

ViewStub simpleViewStub = (ViewStub) findViewById(R.id.simpleViewStub); // get the reference of ViewStub
View inflated = simpleViewStub.inflate(); // inflate the layout resource

توی کد بالا ما میبینم که تابع یه View رو برمیگردونه و حالا اگه بخوایم findViewById بزنیم باید حتما از این ویو استفاده کنیم چون ویو ها هنوز داخل لایوت اصلی ما کپی نشدن و ویو جدا دارن (البته اونجور که فکر میکنم بازم شما تست کنید :))

با تابع زیر میتونید بهش یه لایوت بدید و بعد inflate کنید

simpleViewStub.getLayoutResource(R.layout.stub_layout); 

همین چیز دیگه ای نداره البته باز میتونید برای مشاهده مثال های بیشتر و توضیحات بیشتر این ویو اینجا رو بخونید

 

  • TextureView

یه ویو نه چندان پر استفاده است که اینجوری توضیح داده شده "اگه شما بخواید یه ویدیوی زنده یا مثلا دوربین گوشی را در برنامه خود نمایش دهید و یا حتی صحنه ای از openGL این ویو بهترین گزینه ممکن است

 

  • SurfaceView

همونطور که میدونید همه ویو ها در ترد UI Thread رسم و کشیده میشن اما این ویو رو میتونید شخصی سازی کنید و در کنار یوآی ترد کار رو انجام بدید

یعنی تقریبا میشه گفت برای یو ای هایی که رندر کردنشون زمان میبره کاربرد داره

 

تقریبا تمومه اما چیزهای خیلی کاربردی هم هست که شاید کمتر دیده باشید مثل TextInputLayout که خیلی قشنگه و خیلی برنامه ها دارن ازش استفاده میکنن کارش اینه که متن hint رو با نوشتن اولین حرف به بالا میفرسته تا کااربر هم hint رو بتونه ببینه هم متن خودش رو بنویسه

 

حتما کم و کسری زیاد داشت این آموزشم  به بزرگی خودتون ببخشید

اگه سوالی چیزی بود یا شما هم ویو کشف کردید و بنده ننوشته بودم اینجا میتونید توی الفبا ثبت نام کنید و خودتون پست بزارید :)

فعلا تا آموزش بعدی یاعلی