مرتضی دلیل
مرتضی دلیل
خواندن ۳ دقیقه·۵ سال پیش

لی اوت در اندروید بخش ۷ : آشنایی با اتریبیوت weight

این مقاله به همراه دیگر مقالات این مجموعه ۱۶ قسمتی، بر اساس آموزش ویدیویی در pluralsight به نام Android Fundamental : Layout تهیه شده است. تاریخ تولید این دوره ۲۰۱۹ است.
روند منبع فوق در فهرست و محتوای مقالات، بطور کلی حفظ شده است ولی در جزئیات یک ترجمه کلمه به کلمه نیست؛ نگارش فهرست و محتوا با افزودن و دخالت همراه بوده است.
بطور کلی هر جا حس شده توضیح بیشتر به درک مطلب کمک می‌کند دریغ نشده است.

لی اوت در اندروید ۱ : مفاهیم اولیه
لی اوت در اندروید ۲ : آشنایی با اتریبیوت های width و height
لی اوت در اندروید ۳ : آشنایی با اتریبیوت های margin و padding
لی اوت در اندروید ۴ : آشنایی با اتریبیوت gravity
لی اوت در اندروید ۵ : آشنایی با لی اوت های پایه
لی اوت در اندروید ۶ : آشنایی با LinearLayout
لی اوت در اندروید ۷ : اتریبیوت weight (در حال خواندن این مقاله هستید)
لی اوت در اندروید ۸ : آشنایی با FrameLayout
لی اوت در اندروید ۹ : آشنایی با RelativeLayout
لی اوت در اندروید ۱۰: آشنایی با CoordinateLayout
لی اوت در اندروید ۱۱ : آشنایی با ConstraintLayout
لی اوت در اندروید ۱۲ : آشنایی با Layout Inspector
لی اوت در اندروید ۱۳ : بهینه سازی رابط کاربری
لی اوت در اندروید ۱۴ : استفاده از تگ include
لی اوت در اندروید ۱۵ : استفاده از تگ merge
لی اوت در اندروید ۱۶ : استفاده از ViewStub



فرض کنید میخواهیم دو تکست ویو به شکلی که نمایش داده شده اند به نسبت مساوی در طول صفحه قرار گیرند.

دو تکست ویو در کنار هم و به شکل wrap_content هستند.
دو تکست ویو در کنار هم و به شکل wrap_content هستند.

از اتریبیوت layout_weight استفاده می‌کنیم، که یعنی اگر کل طول صفحه 2 باشد به نسبت 1 و 1 این دو ویو قرار گیرند.

میتوانیم به هر المان وزنی بدهیم که معرف سهم آن المان در طول یا عرض لی اوت است.
میتوانیم به هر المان وزنی بدهیم که معرف سهم آن المان در طول یا عرض لی اوت است.

خروجی به شکل زیر خواهد بود

سهم هر المان یک دوم از طول لی اوت است.
سهم هر المان یک دوم از طول لی اوت است.

دقت کنید که layout_width چون اهمیتی ندارد، صفر قرار داده شده است و به شکل خودکار بر اساس وزن هر ویو تعیین میشود.

برای layout_height مقدار wrap_content قرار دادیم.اما اگر بخواهیم حالت layout_weight را برای یک لی اوت ورتیکال اعمال کنیم چون بر اساس وزن میزان ارتفاع هر کدام تعیین میشود در آنجا چیزی که باید صفر باشد layout_height است که بطور خودکار تعیین میشود.

در حالت landscape هم همین نوع منطق برقرار است.

در حالت landscape هم شرایط مشابهی برقرار است.
در حالت landscape هم شرایط مشابهی برقرار است.

برای مثال همان صفحه لاگین که در بخش قبلی طراحی کردیم را به شکل زیر اصلاح می‌کنیم، در زیر دکمه Login میخواهیم دو لینکی که وجود دارد با وزن یکسان در کنار هم قرار گیرند:

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

برای اینکار از حالت textیا همان xml استفاده میکنیم.

به هر کدام وزن 1 دادیم که سهم آنها در linearLayout پرنتشان مساوی باشد.
به هر کدام وزن 1 دادیم که سهم آنها در linearLayout پرنتشان مساوی باشد.

همچنین layout_width را صفر قرار میدهیم

به وضوح دیده میشود که این دو ویو با وزن یکسان به لحاظ طولی در کنار هم قرار میگیرد

مثالی از وزن های نابرابر :

مجموع وزن ها 3 است و سهم آنها یک سوم و دو سوم خواهد بود.
مجموع وزن ها 3 است و سهم آنها یک سوم و دو سوم خواهد بود.

یعنی اگر وزن کل طول صفحه 3 باشد (جمع دو وزن) وزن اولی 1 و وزن دومی 2 باشد که نتیجه آن را در تصویر میبینید.

اگر یکی از ویوها layout_wieght داشته باشد و یکی نداشته باشد چه میشود؟

یک المان وزن دارد و دیگری ندارد.
یک المان وزن دارد و دیگری ندارد.

المانی که بدون وزن است به اندازه content خود فضا را اشغال می‌کند و دیگر المان (های) وزن دار، بر اساس وزن(شان) از باقیمانده فضا سهم خواهند برد.

اگر چند ویو داشته باشیم:

فرق سمتی راستی با سمت چپی این است که فقط ویوی سمت راست و سمت چپ وزن 1 دارند پس ماکزیمم طول ممکن را اشغال میکنند و فضای باقیمانده به وسطی که بدون وزن است میرسد. در تصویر سمت چپ هر سه ویو وزن یکسان 1 دارند پس هر کدام طولی برابر با 1/3 صفحه را اشغال میکنند.

در بخش بعدی به FrameLayout خواهیم پرداخت.

آموزش اندرویدآموزش لی اوتandroid layoutweight android layoutبرنامه نویسی
برنامه نویس و علاقمند به برنامه نویسی، سینما، فلسفه و هر چیزی که هیجان انگیز باشد. در ویرگول از روزمرگیهای مرتبط با علاقمندیهام خواهم نوشت. در توئیتر و جاهای دیگر @mortezadalil هستم.
شاید از این پست‌ها خوشتان بیاید