जवाबों:
साथ layout_weight
आपको कई दृश्य के बीच एक आकार अनुपात निर्दिष्ट कर सकते हैं। उदाहरण के लिए, आपके पास एक है MapView
और table
जिसे नक्शे में कुछ अतिरिक्त जानकारी दिखानी चाहिए। मानचित्र को स्क्रीन का 3/4 उपयोग करना चाहिए और तालिका को स्क्रीन का 1/4 उपयोग करना चाहिए। तो फिर तुम तय करेंगे layout_weight
की map
3 और layout_weight
की table
1 के लिए।
इसे काम करने के लिए आपको 0px तक की ऊँचाई या चौड़ाई (आपके अभिविन्यास के आधार पर) को सेट करना होगा।
संक्षेप में, layout_weight
निर्दिष्ट करता है कि लेआउट में कितना अतिरिक्त स्थान व्यू को आवंटित किया जाना है।
LinearLayout व्यक्तिगत बच्चों को एक वजन प्रदान करने का समर्थन करता है। यह विशेषता एक दृश्य के लिए "महत्व" मान प्रदान करती है, और यह मूल दृश्य में किसी भी शेष स्थान को भरने के लिए विस्तार करने की अनुमति देती है। दृश्य का डिफ़ॉल्ट वजन शून्य है।
सामान्य तौर पर, सूत्र है:
बच्चे को सौंपा गया स्थान = (बच्चे का व्यक्तिगत वजन) / (रैखिक लेआउट में हर बच्चे के वजन का योग)
यदि तीन पाठ बॉक्स हैं और उनमें से दो 1 का वजन घोषित करते हैं, जबकि तीसरे को कोई भार नहीं दिया जाता है (0), तो शेष स्थान को निम्नानुसार सौंपा गया है:
1 टेक्स्ट बॉक्स = 1 / (1 + 1 + 0)
दूसरा पाठ बॉक्स = 1 / (1 + 1 + 0)
3 टेक्स्ट बॉक्स = 0 / (1 + 1 + 0)
मान लीजिए कि हमारे पास एक पाठ लेबल है और दो पाठ एक क्षैतिज पंक्ति में तत्वों को संपादित करते हैं। लेबल में कोई layout_weight
निर्दिष्ट नहीं है, इसलिए यह रेंडर करने के लिए आवश्यक न्यूनतम स्थान लेता है। यदि layout_weight
दो टेक्स्ट एडिट एलिमेंट्स में से प्रत्येक 1 पर सेट है, तो पैरेंट लेआउट में शेष चौड़ाई उनके बीच समान रूप से विभाजित हो जाएगी (क्योंकि हम दावा करते हैं कि वे समान रूप से महत्वपूर्ण हैं)।
गणना:
1 लेबल = 0 / (0 + 1 + 1)
दूसरा पाठ बॉक्स = 1 / (0 + 1 + 1)
3 टेक्स्ट बॉक्स = 1 / (0 + 1 + 1)
यदि, इसके बजाय, पहले एक टेक्स्ट बॉक्स में layout_weight
1 है, और दूसरे टेक्स्ट बॉक्स में layout_weight
2 है, तो शेष स्थान का एक तिहाई हिस्सा पहले को दिया जाएगा, और दो तिहाई को दूसरे को (क्योंकि हम दूसरे का दावा करते हैं) एक अधिक महत्वपूर्ण है)।
गणना:
1 लेबल = 0 / (0 + 1 + 2)
दूसरा पाठ बॉक्स = 1 / (0 + 1 + 2)
3 टेक्स्ट बॉक्स = 2 / (0 + 1 + 2)
android:layout_width="0px"
महत्वपूर्ण है। इसके अलावा, वज़न को पूर्णांक होने की आवश्यकता नहीं है।
weightSum
फिर तस्वीर कहाँ आती है? क्या इसका कोई लेना-देना है layout_weight
?
अन्य उत्तरों में जोड़कर, इसे काम करने के लिए सबसे महत्वपूर्ण बात यह है कि लेआउट की चौड़ाई (या ऊंचाई) को 0px पर सेट करना है
android:layout_width="0px"
अन्यथा आप कचरा देखेंगे
अगर वहाँ कई विचार फैले हुए हैं LinearLayout
, तो layout_weight
उन्हें प्रत्येक एक आनुपातिक आकार देता है। एक बड़े layout_weight
मूल्य के साथ एक दृश्य "वजन" अधिक होता है, इसलिए इसे एक बड़ा स्थान मिलता है।
यहां चीजों को और अधिक स्पष्ट करने के लिए एक छवि है।
शब्द लेआउट वजन गणित में भारित औसत की अवधारणा से संबंधित है । यह एक कॉलेज वर्ग की तरह है, जहां होमवर्क 30% है, उपस्थिति 10% है, मिडटर्म की कीमत 20% है, और अंतिम 40% है। उन हिस्सों के लिए आपका स्कोर, जब एक साथ भारित किया जाता है, तो आप अपना कुल ग्रेड देते हैं।
यह लेआउट भार के लिए समान है। Views
एक क्षैतिज में LinearLayout
प्रत्येक कुल चौड़ाई का एक निश्चित प्रतिशत तक का समय लग सकता है। (या ऊर्ध्वाधर के लिए ऊंचाई का एक प्रतिशत LinearLayout
।)
LinearLayout
कुछ इस तरह है कि आप प्रयोग दिखेगा:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!-- list of subviews -->
</LinearLayout>
ध्यान दें कि आप का उपयोग करना चाहिए layout_width="match_parent"
के लिए LinearLayout
। यदि आप उपयोग करते हैं wrap_content
, तो यह काम नहीं करेगा। यह भी ध्यान दें कि layout_weight
RelativeLayouts में विचारों के लिए काम नहीं करता है ( इस मुद्दे से निपटने के लिए SO के उत्तर यहां और यहां देखें )।
क्षैतिज में प्रत्येक दृश्य LinearLayout
कुछ इस तरह दिखता है:
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
ध्यान दें कि आपको layout_width="0dp"
एक साथ उपयोग करने की आवश्यकता है layout_weight="1"
। इसे भूल जाने से कई नए उपयोगकर्ताओं को परेशानी होती है। ( विभिन्न परिणामों के लिए इस लेख को देखें। आप चौड़ाई को 0. पर सेट करके प्राप्त कर सकते हैं।) यदि आपके विचार एक ऊर्ध्वाधर में हैं, LinearLayout
तो आप निश्चित रूप से उपयोग करेंगे layout_height="0dp"
।
Button
ऊपर दिए गए उदाहरण में मैंने 1 का वजन निर्धारित किया है, लेकिन आप किसी भी संख्या का उपयोग कर सकते हैं। यह केवल कुल है जो मायने रखता है। आप पहली छवि में बटन की तीन पंक्तियों में देख सकते हैं जो मैंने पोस्ट किया है, संख्याएं सभी भिन्न हैं, लेकिन चूंकि अनुपात समान हैं, प्रत्येक पंक्ति में भारित चौड़ाई नहीं बदलती है। कुछ लोग दशमलव संख्याओं का उपयोग करना पसंद करते हैं जिनकी संख्या 1 होती है ताकि एक जटिल लेआउट में यह स्पष्ट हो कि प्रत्येक भाग का वजन क्या है।
एक अंतिम नोट। यदि आपके पास बहुत से नेस्टेड लेआउट हैं जो उपयोग करते हैं layout_weight
, तो यह प्रदर्शन के लिए बुरा हो सकता है।
यहाँ शीर्ष छवि के लिए xml लेआउट दिया गया है:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="android:layout_weight="
android:textSize="24sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="1" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="2" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="1" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="android:layout_weight="
android:textSize="24sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="10"
android:text="10" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="20"
android:text="20" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="10"
android:text="10" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="android:layout_weight="
android:textSize="24sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".25"
android:text=".25" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".50"
android:text=".50" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".25"
android:text=".25" />
</LinearLayout>
</LinearLayout>
layout_weight
एंड्रॉइड को बताता है कि अपने View
एस को एक में कैसे वितरित करें LinearLayout
। Android तब सबसे पहले उन सभी View
s के लिए आवश्यक कुल अनुपात की गणना करता है जिनका वजन निर्दिष्ट है और प्रत्येक View
को स्क्रीन के किस अंश के अनुसार यह निर्दिष्ट करता है कि उसे इसकी आवश्यकता है। निम्नलिखित उदाहरण में, एंड्रॉइड देखता है कि TextView
एस में एक layout_weight
है 0
(यह डिफ़ॉल्ट है) और EditText
एस में layout_weight
से 2
प्रत्येक का Button
वजन है , जबकि का वजन है 1
। इसलिए Android आबंटित करता है प्रदर्शित करने के लिए 'पर्याप्त' अंतरिक्ष tvUsername
और tvPassword
और फिर 5 बराबर भागों, जिनमें से दो को आवंटित किया जाता में स्क्रीन की चौड़ाई के शेष बिताते हैं etUsername
, करने के लिए दो etPassword
और करने के लिए अंतिम भाग bLogin
:
<LinearLayout android:orientation="horizontal" ...>
<TextView android:id="@+id/tvUsername"
android:text="Username"
android:layout_width="wrap_content" ... />
<EditText android:id="@+id/etUsername"
android:layout_width="0dp"
android:layout_weight="2" ... />
<TextView android:id="@+id/tvPassword"
android:text="Password"
android:layout_width="wrap_content" />
<EditText android:id="@+id/etPassword"
android:layout_width="0dp"
android:layout_weight="2" ... />
<Button android:id="@+id/bLogin"
android:layout_width="0dp"
android:layout_weight="1"
android:text="Login"... />
</LinearLayout>
ऐसा लगता है:
और
इसे इस तरह से सोचें, सरल हो जाएगा
यदि आपके पास 3 बटन हैं और उनके वजन के अनुसार 1,3,1 हैं, तो यह HTML में तालिका की तरह काम करेगा
उस पंक्ति के लिए 5 भाग प्रदान करें: बटन 1 के लिए 1 भाग, बटन 2 के लिए 3 भाग और बटन 1 के लिए 1 भाग
संबंध में,
मेरे लिए सबसे अच्छा स्पष्टीकरणों में से एक यह एक था (एंड्रॉइड ट्यूटोरियल से, चरण 7 के लिए देखें) :
लेआउट_वेट का उपयोग लेआउट में दृश्य के लिए "महत्व" को निर्दिष्ट करने के लिए LinearLayouts में किया जाता है। सभी दृश्यों में शून्य का डिफ़ॉल्ट लेआउट_वेट होता है, जिसका अर्थ है कि वे स्क्रीन पर केवल उतना ही कमरा लेते हैं जितना उन्हें प्रदर्शित करने की आवश्यकता होती है। प्रत्येक शून्य के लेआउट_वेट के मूल्य और इसके और वर्तमान के अन्य तत्वों के लिए वर्तमान लेआउट में निर्दिष्ट कुल लेआउट_वेट के अनुपात के अनुसार, शून्य से अधिक मान असाइन करने से पेरेंट व्यू में उपलब्ध जगह के बाकी हिस्से को विभाजित कर दिया जाएगा।
एक उदाहरण देने के लिए: मान लें कि हमारे पास एक पाठ लेबल है और दो पाठ तत्व एक क्षैतिज पंक्ति में हैं। लेबल में कोई लेआउट_वेट निर्दिष्ट नहीं है, इसलिए यह रेंडर करने के लिए आवश्यक न्यूनतम स्थान लेता है। यदि दो टेक्स्ट एडिट एलिमेंट्स में से प्रत्येक का लेआउट_वेट 1 पर सेट है, तो पैरेंट लेआउट में शेष चौड़ाई उनके बीच समान रूप से विभाजित हो जाएगी (क्योंकि हम दावा करते हैं कि वे समान रूप से महत्वपूर्ण हैं)। यदि पहले वाले का लेआउट_वेट 1 है और दूसरे का लेआउट_वेट 2 है, तो बचे हुए स्थान का एक तिहाई हिस्सा पहले को दिया जाएगा, और दूसरे को दो तिहाई (क्योंकि हम दावा करते हैं कि दूसरा अधिक महत्वपूर्ण है)।
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
लेआउट_वेट परिभाषित करता है कि अन्य नियंत्रणों को क्रमशः कितना स्थान प्राप्त करना चाहिए।
कृपया LinearLayout के वजन और प्रत्येक दृश्य के लेआउट_वेट को देखें। एंड्रॉइड: वेटसम = "4" एंड्रॉइड: लेआउट_वेट = "2" एंड्रॉइड: लेआउट_वेट = "2" उनका लेआउट_हाइट दोनों 0px हैं, लेकिन मुझे यकीन नहीं है कि यह रीलेवन है
<?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"
android:weightSum="4">
<fragment android:name="com.example.SettingFragment"
android:id="@+id/settingFragment"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="2"
/>
<Button
android:id="@+id/dummy_button"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="2"
android:text="DUMMY"
/>
</LinearLayout>
दोनों उत्तरों को मिलाकर
फ़्लोट और रप्त्स्थी और रीतज़ी,
अपने को बदलने के लिए याद रखें layout_width=0dp/px
, अन्यथा layout_weight
व्यवहार सबसे बड़ी संख्या में सबसे छोटे स्थान पर कब्जा कर लिया जाएगा और सबसे कम संख्या सबसे बड़ी जगह पर कब्जा कर लेगी।
इसके अलावा, कुछ वज़न संयोजन के कारण कुछ लेआउट दिखाए जा सकते हैं (क्योंकि यह स्थान पर कब्जा कर लिया गया है)।
इससे सावधान रहें।
जोड़ना android:autoSizeTextType="uniform"
स्वचालित रूप से आपके लिए पाठ का आकार बदल देगा
जैसा कि नाम से पता चलता है, लेआउट वज़न निर्दिष्ट करता है कि किसी विशेष क्षेत्र या विजेट की कितनी राशि या प्रतिशत स्क्रीन स्पेस पर कब्जा करना चाहिए।
यदि हम क्षैतिज अभिविन्यास में वजन निर्दिष्ट करते हैं, तो हमें निर्दिष्ट करना होगा layout_width = 0px
।
इसी तरह, यदि हम ऊर्ध्वाधर अभिविन्यास में वजन निर्दिष्ट करते हैं, तो हमें निर्दिष्ट करना होगा layout_height = 0px
।