LinearLayout की मूल बातें समझाते हैं — Android SDK में एक बुनियादी ViewGroup जो चाइल्ड एलिमेंट्स को एक पंक्ति में संरेखित करती है: लंबवत (LinearLayout.VERTICAL) या क्षैतिज (LinearLayout.HORIZONTAL)। LinearLayout बटनों की पंक्ति, सेटिंग्स सूची या इनपुट फ़ॉर्म बनाने का सबसे सरल और तेज़ तरीका बना हुआ है जब लेआउट की जटिलता 5–10 एलिमेंट्स से अधिक न हो। layout_weight और orientation विशेषताएँ स्थान वितरण और दिशा का प्रबंधन करती हैं। विस्तृत विनिर्देश — LinearLayout API Reference में।
मुख्य बातें
LinearLayout — Android SDK (API Level 1) में पहली ViewGroups में से एक, जो चाइल्ड एलिमेंट्स को क्रमिक रूप से एक पंक्ति या कॉलम में रखने के लिए डिज़ाइन की गई है। प्रत्येक नया एलिमेंट पिछले के बाद रखा जाता है, और दिशा android:orientation विशेषता द्वारा सेट की जाती है। LinearLayout सबसे सरल और पूर्वानुमानित Android कंटेनर है, जो इसे रैखिक इंटरफ़ेस के लिए आदर्श विकल्प बनाता है: बटन पंक्तियाँ, आइकन और टेक्स्ट के साथ सेटिंग्स सूचियाँ, क्षैतिज मेनू।
ऐतिहासिक रूप से, LinearLayout पहली ViewGroup है जिससे एक शुरुआती Android डेवलपर परिचित होता है। इसका लाभ पारदर्शिता है: चाइल्ड एलिमेंट्स बिना छिपे हुए पोजिशनिंग नियमों के, घोषणा क्रम में सख्ती से रखे जाते हैं। RelativeLayout के विपरीत, जहाँ एक एलिमेंट किसी भी पड़ोसी से जुड़ सकता है, या ConstraintLayout अपनी बाधा प्रणाली के साथ, LinearLayout "पहले बाएँ/ऊपर, उसके बाद दूसरा, दूसरे के बाद तीसरा" सिद्धांत पर काम करता है। Google I/O 2017 के अनुसार, Google Play के शीर्ष 1000 ऐप्स में 78% स्क्रीन LinearLayout को अपने प्राथमिक या सहायक कंटेनर के रूप में उपयोग करती हैं।
LinearLayout का मुख्य मीट्रिक LinearLayout.MeasureSpec — आकार प्रबंधन प्रणाली है। VERTICAL ओरिएंटेशन के साथ, प्रत्येक एलिमेंट की चौड़ाई पेरेंट की चौड़ाई (match_parent या निश्चित) के बराबर होती है, और ऊँचाई सामग्री या विशेषता द्वारा निर्धारित की जाती है। HORIZONTAL के लिए इसका उल्टा है: ऊँचाई पेरेंट के बराबर, चौड़ाई सामग्री के अनुसार। यदि HORIZONTAL पंक्ति में कुल एलिमेंट चौड़ाई पेरेंट की चौड़ाई से अधिक हो जाती है, तो एलिमेंट स्क्रीन से बाहर निकल सकते हैं (यदि weight का उपयोग नहीं किया जाता है)।
LinearLayout ViewGroup से onMeasure और onLayout को ओवरराइड करता है। VERTICAL ओरिएंटेशन के साथ, onLayout एलिमेंट्स को Y अक्ष के साथ रखता है: पहला चाइल्ड — y=0, दूसरा — y=prev.bottom + divider.hidden, और इसी तरह। HORIZONTAL के साथ — X अक्ष के साथ। Divider android:divider और android:showDividers (beginning, middle, end) के माध्यम से सेट किया जाता है। Divider एक रंग, drawable या कस्टम Shape संसाधन हो सकता है।
ओरिएंटेशन — LinearLayout की एक महत्वपूर्ण विशेषता जो चाइल्ड एलिमेंट्स की स्थिति की दिशा निर्धारित करती है। android:orientation="vertical" एलिमेंट्स को ऊपर से नीचे व्यवस्थित करता है; android:orientation="horizontal" — बाएँ से दाएँ (या RTL लोकलाइज़ेशन के साथ दाएँ से बाएँ)। यदि ओरिएंटेशन सेट नहीं है, तो डिफ़ॉल्ट रूप से HORIZONTAL का उपयोग किया जाता है (पुराने संस्करणों पर) — लेकिन पूर्वानुमानित व्यवहार के लिए स्पष्ट विनिर्देश आवश्यक है।
android:gravity — LinearLayout के अंदर सामग्री को संरेखित करता है। संयोजन स्वीकार करता है: top, bottom, left, right, center, center_horizontal, center_vertical, fill, clip_vertical, clip_horizontal। VERTICAL लेआउट के लिए gravity="center" का मान सभी एलिमेंट्स को क्षैतिज रूप से केंद्रित करेगा। android:layout_gravity — एक चाइल्ड एलिमेंट विशेषता जो इसे पेरेंट LinearLayout के अंदर संरेखित करती है। उदाहरण: VERTICAL लेआउट में layout_gravity="right" वाला बटन बटन को दाएँ किनारे पर धकेल देगा।
अंतर: gravity — पेरेंट की संपत्ति (चिल्ड्रन उसके अंदर कैसे व्यवस्थित होते हैं), layout_gravity — चाइल्ड की संपत्ति (वह पेरेंट के अंदर कैसे व्यवहार करता है)। इन विशेषताओं को भ्रमित करना शुरुआती लोगों की सबसे आम गलतियों में से एक है।
टेक्स्ट एलिमेंट्स (TextView, Button, EditText) वाले HORIZONTAL लेआउट के लिए, android:baselineAligned="true" उपयोगी है — यह सभी टेक्स्ट को उनके पैडिंग, आकार या ऊँचाई की परवाह किए बिना फ़ॉन्ट बेसलाइन द्वारा संरेखित करता है। यह आइकन, शीर्षक और विवरण वाली पंक्ति को दृष्टिगत रूप से साफ-सुथरा बनाता है: टेक्स्ट ऊपर-नीचे नहीं उछलता।
layout_weight — LinearLayout की एक चाइल्ड एलिमेंट विशेषता जो निर्धारित करती है कि वह खाली स्थान का कितना हिस्सा लेगा। यह केवल ओरिएंटेशन दिशा में काम करता है (HORIZONTAL के लिए चौड़ाई, VERTICAL के लिए ऊँचाई)। गणना सूत्र: आकार = अपना आकार + (खाली स्थान × (एलिमेंट का वजन / सभी वजनों का योग))। खाली स्थान = पेरेंट का आकार — सभी चिल्ड्रन के अपने आकारों का योग।
layout_weight अनुकूली इंटरफ़ेस के लिए निश्चित आकारों की तुलना में अधिक कुशल है। उदाहरण के लिए, यदि बाएँ पैनल को स्क्रीन का 30% और दाएँ को 70% घेरना चाहिए, तो weight=3 और weight=7 सेट करें। सही संचालन के लिए, दिशा में आकार आमतौर पर 0dp पर सेट किया जाता है (android:layout_width="0dp" HORIZONTAL के लिए), फिर एलिमेंट का अपना आकार शून्य माना जाता है, और पूरा आकार केवल weight द्वारा निर्धारित होता है। यह मानक Google अनुशंसा है (Android Developers Guide, 2024)।
महत्वपूर्ण: वजन LinearLayout में सभी एलिमेंट्स के लिए जोड़े जाते हैं, जिनमें वे भी शामिल हैं जिनका weight सेट नहीं है (उनका वजन 0 माना जाता है)। यदि एक एलिमेंट का weight=1 और दूसरे का weight=2 है, तो पहला खाली स्थान का 1/3 लेगा, दूसरा — 2/3। weightSum (पेरेंट की विशेषता) अधिकतम वजन योग सेट करने की अनुमति देता है — यदि चाइल्ड वजन का योग weightSum से कम है, तो अंतर खाली स्थान रहता है।
लॉगिन फ़ॉर्म में तीन एलिमेंट होते हैं: ईमेल फ़ील्ड (स्क्रीन की ऊँचाई का 2/4), पासवर्ड फ़ील्ड (1/4) और बटन (1/4)। weight वाले तीनों एलिमेंट केवल VERTICAL ओरिएंटेशन में ऊँचाई के अनुसार काम करते हैं।
<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="पासवर्ड"
android:inputType="textPassword" />
<Button
android:id="@+id/login_button"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="लॉग इन करें" />
</LinearLayout>
प्रत्येक एलिमेंट की ऊँचाई = (parent_height — padding) × (weight / sumWeights)। email को ऊँचाई का 2/4 मिलता है, पासवर्ड और बटन — प्रत्येक को 1/4। सभी height=0dp, इसलिए अपना आकार नहीं माना जाता — केवल weight काम करता है।
तीन बटनों वाला पैनल: बैक आइकन (wrap_content), शीर्षक (शेष भरें) और मेनू आइकन (wrap_content)। शीर्षक के लिए weight=1, बटन बिना weight के।
<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="शीर्षक"
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>
बैक और मेनू बटन आइकन के लिए आवश्यकतानुसार उतनी ही जगह लेते हैं। width=0dp और weight=1 वाला शीर्षक (TextView) उनके बीच शेष सभी स्थान पर फैल जाता है। gravity="center_vertical" सभी एलिमेंट्स को लंबवत रूप से केंद्रित करता है।
एक उत्पाद कार्ड: क्षैतिज पंक्ति (छवि + लंबवत टेक्स्ट ब्लॉक)। बाहरी LinearLayout HORIZONTAL, आंतरिक — शीर्षक, विवरण और मूल्य के लिए 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="उत्पाद का नाम"
android:textStyle="bold"
android:textSize="16sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="दो पंक्तियों में संक्षिप्त उत्पाद विवरण"
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>
बाईं ओर छवि (80×80dp), दाईं ओर — तीन टेक्स्ट पंक्तियों का लंबवत ब्लॉक। आंतरिक LinearLayout का weight=1 है, इसलिए यह छवि के बाद शेष सभी स्थान घेरता है। यह एक क्लासिक सूची कार्ड पैटर्न है जो हजारों ऐप्स में पाया जाता है।
LinearLayout का मुख्य दोष — जटिल लेआउट के लिए नेस्टेड कंटेनरों की आवश्यकता। यदि आपको एलिमेंट्स को 2×2 ग्रिड में व्यवस्थित करने या दोनों किनारों पर संरेखण के साथ पंक्ति बनाने की आवश्यकता है, तो कम से कम 2–3 नेस्टिंग स्तरों की आवश्यकता होती है। प्रत्येक LinearLayout स्तर 2 onMeasure पास जोड़ता है, जो कमज़ोर उपकरणों पर रेंडरिंग के दौरान ध्यान देने योग्य अंतराल का कारण बनता है।
Android Performance Blog (Google, 2017) के अनुसार, प्रत्येक अतिरिक्त नेस्टिंग स्तर लेआउट समय को 30–50 μs बढ़ाता है। 3 नेस्टिंग स्तरों वाली 20 आइटम्स की सूची के लिए, देरी प्रति एलिमेंट 3 ms तक पहुँच सकती है — यह स्क्रॉल करते समय ध्यान देने योग्य jank है। ConstraintLayout इस समस्या को एक सपाट पदानुक्रम के माध्यम से हल करता है, 3–4 नेस्टेड LinearLayouts को एक एकल बाधा कंटेनर से बदल देता है।
अनुशंसा: सरल रैखिक लेआउट (10 एलिमेंट्स तक, एक नेस्टिंग स्तर) के लिए LinearLayout का उपयोग करें। सूची कार्ड, विभिन्न संरेखण वाले फ़ॉर्म और तालिका संरचना वाली स्क्रीन के लिए ConstraintLayout चुनें। RecyclerView में दोहराए जाने वाले एलिमेंट्स के लिए, आइटम लेआउट फ़ाइल में ConstraintLayout का उपयोग करें — यह स्क्रॉल प्रदर्शन के लिए महत्वपूर्ण है।
अक्सर पूछे जाने वाले प्रश्न
सबसे सामान्य कारण — दिशा में आकार 0dp पर सेट नहीं है। HORIZONTAL लेआउट के लिए android:layout_width="0dp" चाहिए, VERTICAL के लिए — android:layout_height="0dp"। यदि एलिमेंट में wrap_content या match_parent है, तो weight काम नहीं कर सकता या अप्रत्याशित परिणाम दे सकता है। दूसरा कारण — पेरेंट पर weightSum चिल्ड्रन के वजनों के योग से कम है। तीसरा — विपरीत दिशा में चाइल्ड एलिमेंट पर match_parent का उपयोग करना।
layout_weight प्रत्येक चाइल्ड एलिमेंट पर सेट किया जाता है और खाली स्थान में उसकी हिस्सेदारी निर्धारित करता है। weightSum — पेरेंट LinearLayout की एक विशेषता जो अधिकतम वजन योग सेट करती है। डिफ़ॉल्ट रूप से, weightSum = सभी चिल्ड्रन के layout_weight का योग। यदि आप weightSum = 3 सेट करते हैं, और चिल्ड्रन का weight=1 है, तो प्रत्येक 1/3 घेरेगा। यदि weight=1 वाले केवल दो चिल्ड्रन हैं, तो शेष 1/3 खाली होगा। weightSum एलिमेंट्स जोड़ते/हटाते समय पुनर्गणना के बिना अनुपात को स्थिर करने के लिए सुविधाजनक है।
डिफ़ॉल्ट रूप से कोई स्थान नहीं है — एलिमेंट्स एक-दूसरे से सटे रखे जाते हैं। यदि स्थान दिखाई देता है, तो जाँचें: पेरेंट पर android:divider और android:showDividers, चाइल्ड एलिमेंट्स पर android:layout_margin। अतिरिक्त रूप से, android:weightSum प्रभावित कर सकता है — यदि एलिमेंट्स weight का उपयोग करते हैं, तो गलत गणना के कारण उनके बीच खाली स्थान रह सकता है। शून्य स्थान के लिए, सभी चाइल्ड मार्जिन 0dp पर सेट करें और divider हटाएँ।
सरल एक-दिशा लेआउट (एक पंक्ति/कॉलम में 1–5 एलिमेंट) के लिए LinearLayout थोड़ा तेज़ है — यह बाधा गणना पर संसाधन खर्च नहीं करता। जटिल लेआउट (5 से अधिक एलिमेंट, ग्रिड, विभिन्न संरेखण प्रकार) के लिए ConstraintLayout तेज़ है क्योंकि यह नेस्टेड LinearLayouts के बजाय एक सपाट पदानुक्रम का उपयोग करता है। Google परीक्षणों (Android Performance Blog) के अनुसार, ConstraintLayout उन लेआउट पर बेहतर है जिनमें 3+ स्तरों के LinearLayout नेस्टिंग की आवश्यकता होती है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें