Android क्या करता है: लेआउट_वेट का मतलब?


650

मुझे समझ नहीं आया कि इस विशेषता का उपयोग कैसे किया जाए। क्या कोई मुझे इसके बारे में और बता सकता है?

जवाबों:


860

साथ layout_weightआपको कई दृश्य के बीच एक आकार अनुपात निर्दिष्ट कर सकते हैं। उदाहरण के लिए, आपके पास एक है MapViewऔर tableजिसे नक्शे में कुछ अतिरिक्त जानकारी दिखानी चाहिए। मानचित्र को स्क्रीन का 3/4 उपयोग करना चाहिए और तालिका को स्क्रीन का 1/4 उपयोग करना चाहिए। तो फिर तुम तय करेंगे layout_weightकी map3 और layout_weightकी table1 के लिए।

इसे काम करने के लिए आपको 0px तक की ऊँचाई या चौड़ाई (आपके अभिविन्यास के आधार पर) को सेट करना होगा।


208
सिर खरोंच जब तक आप 0px ऊंचाई का उल्लेख किया!
जॉनीलैम्बडा

24
परिभाषित करने के लिए कि उनमें से कौन वजन से प्रभावित होगा। चौड़ाई या ऊँचाई।
neteinstein

30
आपको 0px की आवश्यकता है। उदाहरण: आप एक तालिका को दो समान आकार के स्तंभों के साथ लागू करना चाहते हैं। प्रत्येक तालिका पंक्ति दो "तालिका कोशिकाओं" (उदाहरण के लिए, TextViews) के साथ एक क्षैतिज रैखिक लेआउट है, जिनमें से प्रत्येक में लेआउट_वेट = 5 है। यदि आप "टेबल सेल्स" पर लेआउट_प्रवेशन = "रैप_ कॉन्टेंट" निर्दिष्ट करते हैं, तो कंटेंट की चौड़ाई लेआउट_वेट द्वारा गणना की गई चौड़ाई में जोड़ दी जाएगी, टेबल सेल सभी अलग-अलग आकार के होंगे, और कॉलम सही ढंग से लाइन नहीं करेंगे। इसलिए आपको लेआउट_ एक्सपोज़र = 0 डीपी सेट करना होगा ताकि एंड्रॉइड केवल कोशिकाओं की चौड़ाई की गणना करने के लिए लेआउट_वेट का उपयोग करें।
eeeeaaii

3
@ शोले, देर से जवाब, लेकिन पूर्णता के लिए .. वजन विशेषता की तरह लगता है RelativeLayout में योगदान नहीं कर रहा है। यह केवल LinearLayout के साथ काम करता है। यदि आप वीथ की आवश्यकता देखते हैं, तो शायद जाने का तरीका RelativeLayout के भीतर एक LinearLayout (भार के साथ) बनाना है।
बीबी

1
लेआउट_वेट केवल रैखिक लेआउट के लिए काम करता है या यह हर दृश्य समूह के लिए काम करेगा।
meShakti

247

संक्षेप में, layout_weightनिर्दिष्ट करता है कि लेआउट में कितना अतिरिक्त स्थान व्यू को आवंटित किया जाना है।

LinearLayout व्यक्तिगत बच्चों को एक वजन प्रदान करने का समर्थन करता है। यह विशेषता एक दृश्य के लिए "महत्व" मान प्रदान करती है, और यह मूल दृश्य में किसी भी शेष स्थान को भरने के लिए विस्तार करने की अनुमति देती है। दृश्य का डिफ़ॉल्ट वजन शून्य है।

बच्चे के बीच किसी भी शेष स्थान को असाइन करने के लिए गणना

सामान्य तौर पर, सूत्र है:

बच्चे को सौंपा गया स्थान = (बच्चे का व्यक्तिगत वजन) / (रैखिक लेआउट में हर बच्चे के वजन का योग)

उदाहरण 1

यदि तीन पाठ बॉक्स हैं और उनमें से दो 1 का वजन घोषित करते हैं, जबकि तीसरे को कोई भार नहीं दिया जाता है (0), तो शेष स्थान को निम्नानुसार सौंपा गया है:

1 टेक्स्ट बॉक्स = 1 / (1 + 1 + 0)

दूसरा पाठ बॉक्स = 1 / (1 + 1 + 0)

3 टेक्स्ट बॉक्स = 0 / (1 + 1 + 0)

उदाहरण 2

मान लीजिए कि हमारे पास एक पाठ लेबल है और दो पाठ एक क्षैतिज पंक्ति में तत्वों को संपादित करते हैं। लेबल में कोई layout_weightनिर्दिष्ट नहीं है, इसलिए यह रेंडर करने के लिए आवश्यक न्यूनतम स्थान लेता है। यदि layout_weightदो टेक्स्ट एडिट एलिमेंट्स में से प्रत्येक 1 पर सेट है, तो पैरेंट लेआउट में शेष चौड़ाई उनके बीच समान रूप से विभाजित हो जाएगी (क्योंकि हम दावा करते हैं कि वे समान रूप से महत्वपूर्ण हैं)।

गणना:

1 लेबल = 0 / (0 + 1 + 1)

दूसरा पाठ बॉक्स = 1 / (0 + 1 + 1)

3 टेक्स्ट बॉक्स = 1 / (0 + 1 + 1)

यदि, इसके बजाय, पहले एक टेक्स्ट बॉक्स में layout_weight1 है, और दूसरे टेक्स्ट बॉक्स में layout_weight2 है, तो शेष स्थान का एक तिहाई हिस्सा पहले को दिया जाएगा, और दो तिहाई को दूसरे को (क्योंकि हम दूसरे का दावा करते हैं) एक अधिक महत्वपूर्ण है)।

गणना:

1 लेबल = 0 / (0 + 1 + 2)

दूसरा पाठ बॉक्स = 1 / (0 + 1 + 2)

3 टेक्स्ट बॉक्स = 2 / (0 + 1 + 2)


स्रोत लेख


19
वर्तमान में चयनित उत्तर की तुलना में बहुत बेहतर व्याख्या।
शेड

12
ठीक है, वहाँ सरल स्पष्टीकरण है (जो मैं सराहना करता हूं) और निटी ग्रिट्टी विवरण (जो मैं एक अलग तरीके से सराहना करता हूं)। वे दोनों अच्छे उत्तर हैं।
cbmanica

3
जैसा कि कहीं और उल्लेख किया गया है, android:layout_width="0px"महत्वपूर्ण है। इसके अलावा, वज़न को पूर्णांक होने की आवश्यकता नहीं है।
ब्रायन व्हाइट

चयनित उत्तर की तुलना में यह समझना थोड़ा अधिक कठिन है, लेकिन यह पूर्ण उत्तर देता है - विशेषकर तब जब कुछ दृश्यों में भार होता है और कुछ नहीं होता है। यह एक बड़ा उपयोग मामला है जो चयनित उत्तर द्वारा कवर नहीं किया गया है।
Acey

weightSumफिर तस्वीर कहाँ आती है? क्या इसका कोई लेना-देना है layout_weight?
eRaisedToX

72

अन्य उत्तरों में जोड़कर, इसे काम करने के लिए सबसे महत्वपूर्ण बात यह है कि लेआउट की चौड़ाई (या ऊंचाई) को 0px पर सेट करना है

android:layout_width="0px"

अन्यथा आप कचरा देखेंगे


मुझे लगता है कि यह निर्भर करता है कि क्या आप उन विचारों को छिपाना चाहते हैं जो उनके भार को परिभाषित नहीं करते हैं या आप उन्हें आकार-से-फिट आकार के साथ दिखाना चाहते हैं और शेष खाली स्थान को "भारित" विचारों के लिए छोड़ देते हैं।
एंड्रिया लेगेंज़ा

क्या होगा अगर मुझे क्षैतिज और ऊर्ध्वाधर दोनों वजन सेट करने की आवश्यकता है?
एलस्टन

40

अगर वहाँ कई विचार फैले हुए हैं 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_weightRelativeLayouts में विचारों के लिए काम नहीं करता है ( इस मुद्दे से निपटने के लिए 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>

1
मुझे हमेशा आश्चर्य होता है कि अधिक लोग अपने XML के साथ चित्र पोस्ट करने के लिए क्यों नहीं। कोड की तुलना में दृश्यों को समझना बहुत आसान है।
अलेक्सांद्र

30

layout_weightएंड्रॉइड को बताता है कि अपने Viewएस को एक में कैसे वितरित करें LinearLayout। Android तब सबसे पहले उन सभी Views के लिए आवश्यक कुल अनुपात की गणना करता है जिनका वजन निर्दिष्ट है और प्रत्येक 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>

ऐसा लगता है:
क्षितिज के समानांतर और
चित्र अभिविन्यास


लिंक अब उपलब्ध नहीं है। यदि आपके पास एक और अच्छा संदर्भ है, तो कृपया अपडेट करें।
बाइनरीग्यु जूल

16

इसे इस तरह से सोचें, सरल हो जाएगा

यदि आपके पास 3 बटन हैं और उनके वजन के अनुसार 1,3,1 हैं, तो यह HTML में तालिका की तरह काम करेगा

उस पंक्ति के लिए 5 भाग प्रदान करें: बटन 1 के लिए 1 भाग, बटन 2 के लिए 3 भाग और बटन 1 के लिए 1 भाग

संबंध में,


10

मेरे लिए सबसे अच्छा स्पष्टीकरणों में से एक यह एक था (एंड्रॉइड ट्यूटोरियल से, चरण 7 के लिए देखें) :

लेआउट_वेट का उपयोग लेआउट में दृश्य के लिए "महत्व" को निर्दिष्ट करने के लिए LinearLayouts में किया जाता है। सभी दृश्यों में शून्य का डिफ़ॉल्ट लेआउट_वेट होता है, जिसका अर्थ है कि वे स्क्रीन पर केवल उतना ही कमरा लेते हैं जितना उन्हें प्रदर्शित करने की आवश्यकता होती है। प्रत्येक शून्य के लेआउट_वेट के मूल्य और इसके और वर्तमान के अन्य तत्वों के लिए वर्तमान लेआउट में निर्दिष्ट कुल लेआउट_वेट के अनुपात के अनुसार, शून्य से अधिक मान असाइन करने से पेरेंट व्यू में उपलब्ध जगह के बाकी हिस्से को विभाजित कर दिया जाएगा।

एक उदाहरण देने के लिए: मान लें कि हमारे पास एक पाठ लेबल है और दो पाठ तत्व एक क्षैतिज पंक्ति में हैं। लेबल में कोई लेआउट_वेट निर्दिष्ट नहीं है, इसलिए यह रेंडर करने के लिए आवश्यक न्यूनतम स्थान लेता है। यदि दो टेक्स्ट एडिट एलिमेंट्स में से प्रत्येक का लेआउट_वेट 1 पर सेट है, तो पैरेंट लेआउट में शेष चौड़ाई उनके बीच समान रूप से विभाजित हो जाएगी (क्योंकि हम दावा करते हैं कि वे समान रूप से महत्वपूर्ण हैं)। यदि पहले वाले का लेआउट_वेट 1 है और दूसरे का लेआउट_वेट 2 है, तो बचे हुए स्थान का एक तिहाई हिस्सा पहले को दिया जाएगा, और दूसरे को दो तिहाई (क्योंकि हम दावा करते हैं कि दूसरा अधिक महत्वपूर्ण है)।



4

अतिरिक्त के लिए

के लिए verticalअभिविन्यास, सेट मत भूलना height0dp को

android:layout_height="0dp"

के लिए horizontalअभिविन्यास, सेट मत भूलना width0dp को

android:layout_width="0dp"

3

कृपया 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>

कृपया LinearLayout के वजन और प्रत्येक दृश्य के लेआउट_वेट को देखें। एंड्रॉइड: वेटसम = "4" एंड्रॉइड: लेआउट_वेट = "2" एंड्रॉइड: लेआउट_वेट = "2" उनका लेआउट_हाइट दोनों 0px हैं, लेकिन मुझे यकीन नहीं है कि यह प्रासंगिक है।
मिंग लेउंग

0

दोनों उत्तरों को मिलाकर

फ़्लोट और रप्त्स्थी और रीतज़ी,

अपने को बदलने के लिए याद रखें layout_width=0dp/px, अन्यथा layout_weightव्यवहार सबसे बड़ी संख्या में सबसे छोटे स्थान पर कब्जा कर लिया जाएगा और सबसे कम संख्या सबसे बड़ी जगह पर कब्जा कर लेगी।

इसके अलावा, कुछ वज़न संयोजन के कारण कुछ लेआउट दिखाए जा सकते हैं (क्योंकि यह स्थान पर कब्जा कर लिया गया है)।

इससे सावधान रहें।


0

जोड़ना android:autoSizeTextType="uniform"स्वचालित रूप से आपके लिए पाठ का आकार बदल देगा


-1

जैसा कि नाम से पता चलता है, लेआउट वज़न निर्दिष्ट करता है कि किसी विशेष क्षेत्र या विजेट की कितनी राशि या प्रतिशत स्क्रीन स्पेस पर कब्जा करना चाहिए।
यदि हम क्षैतिज अभिविन्यास में वजन निर्दिष्ट करते हैं, तो हमें निर्दिष्ट करना होगा layout_width = 0px
इसी तरह, यदि हम ऊर्ध्वाधर अभिविन्यास में वजन निर्दिष्ट करते हैं, तो हमें निर्दिष्ट करना होगा layout_height = 0px

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.