LinearLayout — Android SDK-da uşaq elementlərini bir xətt üzrə düzləndirmək üçün əsas ViewGroup: şaquli (LinearLayout.VERTICAL) və ya üfüqi (LinearLayout.HORIZONTAL). LinearLayout düymələr sırası, parametrlər siyahısı və ya giriş forması qurmaq üçün ən sadə və sürətli üsul olaraq qalır, maketin mürəkkəbliyi 5–10 elementdən çox olmadıqda. layout_weight və orientation atributları məkanın paylanmasını və istiqaməti idarə edir. Ətraflı spesifikasiya — LinearLayout API Reference səhifəsində.
Əsas məqamlar
LinearLayout — Android SDK-da (API Level 1) ilk ViewGroup-lardan biri, uşaq elementlərini ardıcıl olaraq bir sətir və ya sütunda yerləşdirmək üçün nəzərdə tutulub. Hər yeni element əvvəlkindən sonra yerləşir və istiqamət android:orientation atributu ilə təyin edilir. LinearLayout Android-in ən sadə və proqnozlaşdırıla bilən konteyneridir, bu da onu xətti interfeyslər üçün ideal seçim edir: düymələr sırası, işarə və mətn ilə parametrlər siyahıları, üfüqi menyular.
Tarixən LinearLayout yeni başlayan Android developerin tanış olduğu ilk ViewGroup-dur. Onun üstünlüyü şəffaflıqdır: uşaq elementləri gizli yerləşdirmə qaydaları olmadan, bəyannamə sırası ilə yerləşdirilir. RelativeLayout-dan fərqli olaraq, burada element istənilən qonşuya bağlana bilər və ya ConstraintLayout-un məhdudiyyət sistemi ilə, LinearLayout «birinci solda/yuxarıda, ikinci ondan sonra, üçüncü ikincidən sonra» prinsipi ilə işləyir. Google I/O 2017 məlumatına görə, Google Play-də top 1000 tətbiqinin 78% ekranı LinearLayout-dan əsas və ya köməkçi konteyner kimi istifadə edir.
LinearLayout-un əsas metriki — LinearLayout.MeasureSpec — ölçü idarəetmə sistemi. VERTICAL oriyentasiyasında hər elementin eni valideynin eninə bərabərdir (match_parent və ya sabit), hündürlük isə məzmun və ya atributla müəyyən edilir. HORIZONTAL üçün əksinə: hündürlük valideynə bərabər, eni — məzmuna görə. HORIZONTAL sətirdə elementlərin ümumi eni valideynin enini keçərsə, elementlər ekrandan kənara çıxa bilər (weight istifadə edilmədikdə).
LinearLayout ViewGroup-dan onMeasure və onLayout metodlarını override edir. VERTICAL oriyentasiyasında onLayout elementləri Y oxu üzrə yerləşdirir: birinci child — y=0, ikinci — y=prev.bottom + divider.hidden və s. HORIZONTAL zamanı — X oxu üzrə. Divider (ayırıcı) android:divider və android:showDividers (beginning, middle, end) vasitəsilə təyin edilir. Ayırıcı rəng, drawable və ya xüsusi Shape resursu ola bilər.
Oriyentasiya — uşaq elementlərinin yerləşmə istiqamətini təyin edən LinearLayout-un əsas atributudur. android:orientation="vertical" elementləri yuxarıdan aşağıya düzür; android:orientation="horizontal" — soldan sağa (RTL lokalizasiyasında sağdan sola). Oriyentasiya təyin edilmədikdə, susmaya görə HORIZONTAL istifadə olunur (köhnə versiyalarda) — lakin proqnozlaşdırıla bilən davranış üçün açıq şəkildə göstərilməsi məcburidir.
android:gravity — LinearLayout daxilində məzmunun düzləndirilməsi. Kombinasiyaları qəbul edir: top, bottom, left, right, center, center_horizontal, center_vertical, fill, clip_vertical, clip_horizontal. VERTICAL maket üçün gravity="center" dəyəri bütün elementləri üfüqi mərkəzə yerləşdirəcək. android:layout_gravity — uşaq elementinin valideyn LinearLayout daxilində özünü düzləndirən atributudur. Nümunə: VERTICAL maketdə layout_gravity="right" olan düymə sağ kənara sıxılacaq.
Fərq: gravity — valideynin xüsusiyyəti (uşaqların onun daxilində necə yerləşdiyi), layout_gravity — uşağın xüsusiyyəti (valideyn daxilində necə davrandığı). Bu atributları qarışdırmaq səhvi yeni başlayanlar arasında ən çox yayılmışdır.
Mətn elementləri olan HORIZONTAL maketlər üçün (TextView, Button, EditText) android:baselineAligned="true" faydalıdır — o, bütün mətnləri şriftin baza xətti üzrə düzləndirir, padding, size və ya height-dən asılı olmayaraq. Bu, işarə, başlıq və təsviri olan sətri vizual olaraq səliqəli edir: mətn yuxarı-aşağı sıçramır.
layout_weight — LinearLayout-un uşaq elementinin atributu, boş məkanın hansı hissəsini tutacağını müəyyən edir. Yalnız oriyentasiya istiqamətində işləyir (HORIZONTAL üçün en, VERTICAL üçün hündürlük). Hesablama düsturu: ölçü = öz ölçüsü + (boş məkan × (elementin çəkisi / bütün çəkilərin cəmi)). Boş məkan = valideynin ölçüsü — bütün uşaqların öz ölçülərinin cəmi.
layout_weight adaptiv interfeyslər üçün sabit ölçülərdən daha səmərəlidir. Məsələn, sol panel ekranın 30%-ni, sağ panel isə 70%-ni tutmalıdırsa, weight=3 və weight=7 təyin edin. Düzgün işləməsi üçün adətən istiqamət üzrə ölçü 0dp qoyulur (android:layout_width="0dp" HORIZONTAL üçün), onda elementin öz ölçüsü sıfır hesab olunur və bütün ölçü yalnız weight ilə müəyyən edilir. Bu, Google-ın standart tövsiyəsidir (Android Developers Guide, 2024).
Vacib: çəkilər LinearLayout-dakı bütün elementlər üçün cəmlənir, o cümlədən weight təyin edilməmişlər (onların çəkisi 0 hesab olunur). Bir elementin weight=1, digərinin weight=2 olarsa, birinci boş məkanın 1/3 hissəsini, ikinci — 2/3 hissəsini tutacaq. weightSum (valideynin atributu) maksimum çəki cəmini təyin etməyə imkan verir — uşaqların çəkilərinin cəmi weightSum-dən az olarsa, fərq boş məkan olaraq qalır.
Giriş forması üç elementdən ibarətdir: email sahəsi (2/4 tutur), şifrə sahəsi (1/4) və düymə (1/4) ekran hündürlüyünə görə. Weight ilə hər üç element yalnız VERTICAL oriyentasiyasında hündürlük üzrə işləyir.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<EditText
android:id="@+id/email"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:hint="Email" />
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:hint="Şifrə"
android:inputType="textPassword" />
<Button
android:id="@+id/login_button"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="Daxil ol" />
</LinearLayout>
Hər elementin hündürlüyü = (parent_height — padding) × (weight / sumWeights). email hündürlüyün 2/4-nü, şifrə və düymə — hər biri 1/4-ü alacaq. Bütün height=0dp, ona görə öz ölçüsü nəzərə alınmır — yalnız weight işləyir.
Üç düyməli panel: geri işarəsi (wrap_content), başlıq (qalanı doldurur) və menyu işarəsi (wrap_content). Başlıq üçün weight = 1, düymələr weightsiz.
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="56dp"
android:gravity="center_vertical">
<ImageButton
android:id="@+id/btn_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_arrow_back" />
<TextView
android:id="@+id/toolbar_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Başlıq"
android:textSize="18sp" />
<ImageButton
android:id="@+id/btn_menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_more_vert" />
</LinearLayout>
Geri və menyu düymələri işarə üçün lazım olan qədər yer tutur. Başlıq (TextView) width=0dp və weight=1 ilə onların arasında qalan bütün boşluğa yayılır. gravity="center_vertical" bütün elementləri şaquli mərkəzə düzləndirir.
Məhsul kartı: üfüqi sətir (şəkil + şaquli mətn bloku). Xarici LinearLayout HORIZONTAL, daxili — başlıq, təsvir və qiymət üçün VERTICAL.
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/product_image"
android:scaleType="centerCrop" />
<LinearLayout
android:orientation="vertical"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="12dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Məhsulun adı"
android:textStyle="bold"
android:textSize="16sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Məhsulun qısa təsviri iki sətirdə"
android:textSize="14sp"
android:textColor="@color/gray" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1 299 rub."
android:textSize="18sp"
android:textColor="@color/accent" />
</LinearLayout>
</LinearLayout>
Şəkil solda (80×80dp), sağda — üç sətir mətndən ibarət şaquli blok. Daxili LinearLayout weight=1-ə malikdir, ona görə şəkildən sonra qalan bütün yeri tutur. Bu, minlərlə tətbiqdə rast gəlinən klassik siyahı kartı nümunəsidir.
LinearLayout-un əsas çatışmazlığı — mürəkkəb maketlər üçün iç-içə konteynerlərin zəruriliyi. Elementləri 2×2 şəbəkəsində yerləşdirmək və ya iki kənara düzləndirmə ilə sətir etmək üçün ən azı 2–3 səviyyə iç-içəlik tələb olunur. Hər LinearLayout səviyyəsi 2 onMeasure keçidi əlavə edir, bu da zəif cihazlarda çəkmə zamanı nəzərə çarpan ləngimələrə səbəb olur.
Android Performance Blog (Google, 2017) məlumatına görə, hər əlavə iç-içəlik səviyyəsi layout vaxtını 30–50 μs artırır. 3 iç-içəlik səviyyəsi olan 20 elementlik siyahı üçün gecikmə element başına 3 ms-ə çata bilər — bu, sürüşdürmə zamanı nəzərə çarpan jank-dır. ConstraintLayout bu problemi düz iyerarxiya vasitəsilə həll edir, 3–4 iç-içə LinearLayout-u məhdudiyyətləri olan bir konteynerlə əvəz edir.
Tövsiyə: sadə xətti maketlər üçün LinearLayout istifadə edin (10 elementə qədər, bir iç-içəlik səviyyəsi). Siyahı kartları, müxtəlif düzləndirməli formalar və cədvəl quruluşlu ekranlar üçün ConstraintLayout seçin. RecyclerView-də təkrarlanan elementlər üçün element layout faylında ConstraintLayout istifadə edin — bu, sürüşdürmə performansı üçün vacibdir.
Tez-tez verilən suallar
Ən çox yayılmış səbəb — istiqamət üzrə ölçü 0dp qoyulmayıb. HORIZONTAL maket üçün android:layout_width="0dp", VERTICAL üçün — android:layout_height="0dp" lazımdır. Element wrap_content və ya match_parent-ə malikdirsə, weight işləməyə və ya gözlənilməz nəticə verə bilər. İkinci səbəb — valideyndə weightSum uşaqların weight cəmindən azdır. Üçüncü — əks istiqamətdə uşaq elementində match_parent istifadəsi.
layout_weight hər uşaq elementində təyin edilir və onun boş məkandakı payını müəyyən edir. weightSum — LinearLayout valideyninin atributu, çəkilərin maksimum cəmini təyin edir. Susmaya görə weightSum = bütün uşaqların layout_weight cəminə bərabərdir. weightSum = 3 təyin etsəniz və hər biri weight=1 olan uşaqlar varsa, hər biri 1/3 tutacaq. weight=1 olan uşaqlar cəmi ikidirsə, qalan 1/3 boş qalacaq. weightSum elementləri əlavə edib çıxararkən nisbətləri yenidən hesablamadan təyin etmək üçün əlverişlidir.
Susmaya görə boşluq yoxdur — elementlər bir-birinə bitişik yerləşir. Boşluqlar yaranıbsa, yoxlayın: valideyndə android:divider və android:showDividers, uşaq elementlərində android:layout_margin. Əlavə olaraq android:weightSum təsir edə bilər — elementlər weight istifadə edərsə, onların arasında səhv hesablama səbəbindən boş məkan qala bilər. Sıfır boşluq üçün bütün uşaqlara margin=0dp təyin edin və divider-ı silin.
Sadə biristiqamətli maketlər üçün (sətirdə/sütunda 1–5 element) LinearLayout bir qədər sürətlidir — məhdudiyyətlərin hesablanmasına resurs sərf etmir. Mürəkkəb maketlər üçün (5 elementdən çox, şəbəkələr, müxtəlif düzləndirmə növləri) ConstraintLayout daha sürətlidir, çünki iç-içə LinearLayout əvəzinə düz iyerarxiyadan istifadə edir. Google testlərinə görə (Android Performance Blog), ConstraintLayout 3+ səviyyə LinearLayout iç-içəliyi tələb edən maketlərdə üstünlük qazanır.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun