android - एंड्रॉइड क्या करता है: layout_weight का मतलब है?




android-layout android-widget (8)

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

android:layout_width="0px"

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

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


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

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

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

संबंध में,


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


दोनों उत्तरों का संयोजन

फ़्लो और rptwsthi और roetzi,

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

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

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


यदि LinearLayout फैले कई विचार हैं, तो layout_weight उन्हें प्रत्येक को आनुपातिक आकार देता है। एक बड़े layout_weight मान के साथ एक दृश्य "वजन" अधिक है, इसलिए यह एक बड़ी जगह हो जाता है।

चीजों को और स्पष्ट करने के लिए यहां एक छवि है।

सिद्धांत

शब्द लेआउट वजन गणित में भारित औसत की अवधारणा से संबंधित है। यह एक कॉलेज कक्षा में है जहां होमवर्क 30% लायक है, उपस्थिति 10% के बराबर है, मिडटरम 20% के लायक है, और अंतिम 40% के बराबर है। उन हिस्सों के लिए आपके स्कोर, जब एक साथ भारित होते हैं, तो आपको अपना कुल ग्रेड देते हैं।

लेआउट वजन के लिए यह वही है। एक क्षैतिज LinearLayout में Views प्रत्येक चौड़ाई का एक निश्चित प्रतिशत ले सकते हैं। (या एक लंबवत LinearLayout लिए ऊंचाई का प्रतिशत।)

अभिन्यास

आपके द्वारा उपयोग किए जाने वाले LinearLayout इस तरह कुछ दिखाई देंगे:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <!-- list of subviews -->

</LinearLayout>

ध्यान दें कि आपको LinearLayout लिए layout_width="match_parent" उपयोग करना होगा। यदि आप wrap_content उपयोग wrap_content , तो यह काम नहीं करेगा। यह भी ध्यान रखें कि layout_weight रिलेटिव layout_weight में विचारों के लिए काम नहीं करता है (इस मुद्दे से निपटने वाले SO उत्तरों के लिए here और here देखें)।

विचार

क्षैतिज LinearLayout में प्रत्येक दृश्य कुछ ऐसा दिखता है:

<Button
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

ध्यान दें कि layout_width="0dp" साथ layout_width="0dp" का उपयोग करने की आवश्यकता है। इसे भूलने से कई नए उपयोगकर्ता समस्याएं आती हैं। ( इस आलेख को विभिन्न परिणामों के लिए देखें जो आप चौड़ाई को 0 पर सेट नहीं कर सकते हैं।) यदि आपके विचार लंबवत layout_height="0dp" तो आप 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 निर्दिष्ट करता है कि दृश्य में लेआउट में कितनी अतिरिक्त जगह आवंटित की जाएगी।

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

बच्चे के बीच किसी भी शेष स्थान को आवंटित करने की गणना

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

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

उदाहरण 1

यदि तीन टेक्स्ट बॉक्स हैं और उनमें से दो 1 का वजन घोषित करते हैं, जबकि तीसरे को कोई वज़न नहीं दिया जाता है, तो शेष स्थान निम्नानुसार असाइन किया जाता है:

पहला टेक्स्ट बॉक्स = 1 / (1 + 1 + 0)

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

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

उदाहरण 2

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

गणना:

पहला लेबल = 0 / (0 + 1 + 1)

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

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

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

गणना:

पहला लेबल = 0 / (0 + 1 + 2)

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

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

स्रोत लेख


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

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


layout_weight एंड्रॉइड को बताता है कि layout_weight अपने View को कैसे वितरित करें। एंड्रॉइड पहले सभी View लिए आवश्यक कुल अनुपात की गणना करता है जिसमें वजन निर्दिष्ट होता है और प्रत्येक View को स्क्रीन के किस अंश के अनुसार निर्दिष्ट करता है, उसके अनुसार यह निर्धारित करता है। निम्न उदाहरण में, एंड्रॉइड देखता है कि layout_weight के पास layout_weight 0 (यह डिफ़ॉल्ट है) और EditText पास प्रत्येक 2 layout_weight है, जबकि Button का वजन 1 । इसलिए एंड्रॉइड tvUsername और tvPassword tvUsername को प्रदर्शित करने के लिए 'बस पर्याप्त' स्थान आवंटित करता है और फिर स्क्रीन चौड़ाई के शेष को 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>

ऐसा लग रहा है:
तथा





android-widget