android - Match_parent और fill_parent के बीच क्या अंतर है?




android-layout (12)

मैं दो एक्सएमएल गुणों के बारे में थोड़ा उलझन में हूं: match_parent और fill_parent । ऐसा लगता है कि दोनों एक ही हैं। क्या उनके बीच कोई अंतर है?


FILL_PARENT को बहिष्कृत किया गया है। बहिष्कृत होने से यह शैतान नहीं बनता है, लेकिन अंततः यह दूर जायेगा। आपका आवेदन MATCH_PARENT का उपयोग कर भविष्य के सबूत है। बहिष्कृत विकल्प का उपयोग क्यों करें जब वर्तमान विकल्प बिल्कुल वही व्यवहार करता है?

इसके अलावा, FILL_PARENT वास्तव में भ्रामक है। मैंने व्यक्तिगत रूप से लोगों को उलझन में देखा है क्योंकि यह जिस तरह से सोचा था, वह काम नहीं करता है। असल में, मैंने FILL_PARENT और MATCH_PARENT दोनों का उपयोग करके एक ही टैग देखा है, क्योंकि डेवलपर ने सोचा (समझ में आता है) कि वे दो अलग-अलग लेआउट मोड थे।

वर्तमान बनो स्पष्ट रहिये। MATCH_PARENT का प्रयोग करें।

आप कैसे भरने के लिए कोशिश कर सकते हैं भरने के लिए कोशिश कर रहे हैं

यहां एक त्वरित उदाहरण दिया गया है कि MATCH_PARENT / FILL_PARENT भ्रम लोगों को बार-बार अपने डेस्क को अपने डेस्क पर लागू करने का कारण बन सकता है। सबसे पहले, कुछ दृश्य उदाहरणों वाला एक बहुत ही सरल लेआउट लें।

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">       
    <View
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:background="#FFFF00" />
    <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:background="@android:color/black"
            android:text="@string/hello_world"
            android:padding="50dp" />
    <View
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FF0000" />         
</LinearLayout>

और डिवाइस पर चलने पर यह वही दिखता है।

वाह, आपने उस लाल दृश्य को MATCH_PARENT पर सेट किया है और यह शेष स्थान को LinearLayout में भर दिया है। यह अपने माता-पिता के रूप में बड़ा नहीं है। क्या देता है?

और यहाँ भ्रम है। लीनियरलाउट अपने बच्चों को अनुक्रमिक रूप से बताता है, बच्चे की प्रारंभिक स्थिति पिछले बच्चे की अंतिम स्थिति है। एक बच्चा अनुरोध करता है कि माता-पिता इसे कुछ आयाम दें, लेकिन इससे प्रभावित नहीं होता है कि बच्चे कहां स्थित है। चूंकि लाल दृश्य तीसरा है, यह पहले दो के बाद रखा गया है, और इस प्रकार, "माता-पिता के रूप में बड़ा" नहीं होता है।

यह स्थिति का एक परिणाम है, नहीं कि MATCH_PARENT / FILL_PARENT कैसे काम करता है। LinearLayout अपने बच्चे के अनुरोधों का सम्मान करता है जो इसे सबसे अच्छा देख सकता है, लेकिन उन्हें गारंटी नहीं दे सकता है।

अब, देखते हैं कि क्या होता है जब हम लेआउट में लाल दृश्य को पहले बनाकर चीजों को बदलते हैं:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">    
    <View
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FF0000" />
    <View
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:background="#FFFF00" />
    <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:background="@android:color/black"
            android:text="@string/hello_world"
            android:padding="50dp" />             
</LinearLayout>

अब यह कैसा दिखता है, और अंतर देखना आसान है। चूंकि लीनियरलाइट पहले लाल दृश्य को बताता है, यह इसे शीर्ष पर रखता है और पूरी तरह से अपने MATCH_PARENT अनुरोध को पूरा कर सकता है। इसके परिणामस्वरूप दो दृश्यों को धक्का देने वाले लाल दृश्य में परिणाम मिलता है।

ठीक है, तो क्या होगा यदि मैं वास्तव में एक व्यू को अपने माता-पिता में शेष स्थान भरना चाहता हूं?

वास्तव में कैसे करें "माता- पिता भरें" माता-पिता भरने "को लागू करने के लिए सामान्य रणनीति एक लाइनरलाउट और लेआउट_वेट विशेषता का उपयोग करना है। अब हम उन्हें ब्लॉब (उस लाल दृश्य) द्वारा लिया गया हमारे दूसरे लेआउट को ठीक करने के लिए उपयोग करेंगे।

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">             
    <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#FF0000" />
    <View
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:background="#FFFF00" />
    <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:background="@android:color/black"
            android:text="@string/hello_world"
            android:padding="50dp" />
</LinearLayout>

यहां हम रेन व्यू को लाइनरलायआउट में पहले बच्चे के रूप में रखने में सक्षम थे और क्या यह केवल दो अन्य विचारों को बिछाने के बाद शेष स्थान भर गया है।

वास्तव में एक लेआउट बनाने के लिए सिर्फ एक ही रास्ता नहीं है। अगर हम लाइनरलाइट में आखिरी बार लाल दृश्य बनाना चाहते थे और इसे शेष स्थान भरना चाहते थे, तो हम पहले लेआउट, कहानी के अंत का उपयोग कर सकते थे। हालांकि, यह समझना महत्वपूर्ण है कि यह क्यों काम करता है और जब यह काम नहीं कर सकता है।


FILL_PARENT का नाम बदलकर एपीआई लेवल 8 में MATCH_PARENT रखा गया था और उच्चतर जिसका मतलब है कि दृश्य अपने माता-पिता (माइनस पैडिंग) के रूप में बड़ा होना चाहता है - Google


fill_parent: दृश्य अपने माता-पिता के रूप में बड़ा होना चाहिए।

अब यह सामग्री fill_parent को बहिष्कृत किया गया है और match_parent द्वारा प्रतिस्थापित किया गया है।


match_parent, जिसका अर्थ है कि दृश्य अपने माता-पिता (माइनस पैडिंग) के रूप में बड़ा होना चाहता है।

wrap_content, जिसका अर्थ है कि दृश्य अपनी सामग्री को संलग्न करने के लिए पर्याप्त बड़ा होना चाहता है (प्लस पैडिंग)

बेहतर चित्रण के लिए, मैंने एक नमूना लेआउट बनाया है जो इस अवधारणा को प्रदर्शित करता है। इसका प्रभाव देखने के लिए, मैंने प्रत्येक पाठ दृश्य सामग्री की एक सीमा जोड़ा।

"मिलान अभिभावक" टेक्स्ट में सामग्री देखें, हम इसकी लेआउट चौड़ाई को इसकी संपूर्ण लंबाई से फैला सकते हैं।

लेकिन हम "लपेटें सामग्री" टेक्स्ट दृश्य सामग्री में देख सकते हैं, इसकी लेआउट चौड़ाई इसकी सामग्री (लपेटें सामग्री) लंबाई में लपेटा गया है।


कार्यात्मक रूप से कोई फर्क नहीं पड़ता, Google ने एपीआई लेवल 8 (एंड्रॉइड 2.2) से सिर्फ fill_parent से match_parent में नाम बदल दिया। FILL_PARENT अभी भी संगतता कारण के लिए उपलब्ध है।

LayoutParams.FILL_PARENT और LayoutParams.MATCH_PARENTLayoutParams.MATCH_PARENT दोनों के पास मूल्य -1 है। सुनिश्चित नहीं है कि Google ने फिल माता-पिता से मिलान करने के लिए Google को क्या प्रेरित किया है :)

चूंकि अधिकांश phones are >= Android 2.2 .. आपको भविष्य की संगतता के लिए मिलान अभिभावक का उपयोग करना चाहिए ... सुनिश्चित नहीं है कि वे पुराने भरने वाले माता-पिता को निरंतर बंद कर देंगे!


जब आप XML प्रॉपर्टी में match_parent रूप में लेआउट width और height सेट करते हैं, तो यह मूल क्षेत्र पर कब्जा कर लेगा, यानी यह माता-पिता के रूप में बड़ा होगा।

<LinearLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:background="#f9b0b0">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#b0f9dc"/>

</LinearLayout>

हरे पैरेंट लाल है और बच्चा हरा है। बच्चे सभी क्षेत्र पर कब्जा कर लिया। क्योंकि इसकी width और height match_parent

नोट: यदि माता-पिता को पैडिंग लागू किया जाता है तो उस स्थान को शामिल नहीं किया जाएगा।

<LinearLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:background="#f9b0b0"
    android:paddingTop="20dp"
    android:paddingBottom="10dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#b0f9dc"/>

</LinearLayout>

तो TextView हाइट = 300 डीपी (पैरेंट हाइट) - (20 (पैडिंग टॉप) +10 (पैडिंगबॉटम)) = (300 - 30) डीपी = 270 डीपी

fill_parent बनाम match_parent

fill_parent का पिछला नाम है

API स्तर 8 और उच्च fill_parent रूप में नामित किया match_parent और fill_parent अब बहिष्कृत है।

तो fill_parent और match_parent समान हैं।

Fill_parent के लिए एपीआई दस्तावेज़ीकरण

दृश्य अपने माता-पिता (माइनस पैडिंग) के जितना बड़ा होना चाहिए। यह निरंतर एपीआई स्तर 8 से शुरू किया गया है और इसे {@code match_parent} द्वारा प्रतिस्थापित किया गया है।


भ्रम से बचने के लिए Google ने नाम बदल दिया।

पुराना नाम fill parent को समस्या यह थी कि इसका मतलब यह है कि यह fill parent के आयामों को प्रभावित करता है, जबकि match parent परिणामस्वरूप व्यवहार का बेहतर वर्णन करता है - माता-पिता के साथ आयाम से मेल खाता है।

दोनों स्थिरांक अंत में -1 को हल करते हैं, और इसलिए ऐप में समान व्यवहार होता है। विडंबना यह है कि, चीजों को स्पष्ट करने के लिए यह नाम बदल गया है, ऐसा लगता है कि इसे खत्म करने के बजाय भ्रम जोड़ा गया है।


मेरे लिए माता - पिता को भरें और माता - पिता से मेल खाता ही वही कार्य करता है जो:

माता-पिता भरें : एपीआई 8 से पहले इस्तेमाल किया गया था

मैच अभिभावक यह एपीआई 8+ से दोनों का उपयोग किया गया था , दोनों पैर भरने के लिए अभिभावक को भरते हैं


संगतता के लिए, एपीआई 8 उपकरणों के नीचे समर्थन करते समय fill_parent, यानी, चिपकने के लिए बेहतर है। लेकिन यदि आपका ऐप एपीआई 8 और ऊपर की ओर लक्षित करता है, तो आपको इसके बजाय match_parent का उपयोग करना चाहिए।


fill_parent (एपीआई लेवल 8 और उच्चतर में MATCH_PARENT का नाम बदल दिया गया), जिसका अर्थ है कि दृश्य अपने माता-पिता के रूप में बड़ा होना चाहता है (माइनस पैडिंग)

fill_parent : दृश्य अपने माता-पिता (माइनस पैडिंग) के जितना बड़ा होना चाहिए। यह निरंतर एपीआई लेवल 8 से शुरू हो गया है और इसे match_parent द्वारा प्रतिस्थापित किया match_parent

Android API 1.6 से 2.1 match_parent आपको एक त्रुटि फेंक देगा, इसलिए इन मामलों में fill_parent का उपयोग करें। पिछड़े संगतता का समर्थन करने के लिए, fill_parent का उपयोग करना बेहतर है

  • दोनों स्थिर अंतिम स्थिरांक हैं जो मान -1 का प्रतिनिधित्व करते हैं
  • एपीआई स्तर 8 में FILL_PARENT को बहिष्कृत किया गया है

तो MATCH_PARENT और FILL_PARENT समान हैं?

हां, MATCH_PARENT और FILL_PARENT एक ही पूर्णांक मान (-1 यदि आप उत्सुक हैं) के लिए केवल अलग-अलग निरंतर नाम हैं, तो इसके माता-पिता के भीतर व्यू का लेआउट मोड निर्दिष्ट करने के लिए उपयोग किया जाता है।

तो MATCH_PARENT क्यों जोड़ा गया था?

मुझे याद है कि रोमन गाय (Google पर एंड्रॉइड डेवलपर) ने कहा है कि उन्होंने नाम बदल दिया है क्योंकि " fill_parent " डेवलपर्स के लिए भ्रमित था। तथ्य के मामले में, " fill_parent " शेष स्थान को भरता नहीं है (इसके लिए आप वजन विशेषता का उपयोग करते हैं) लेकिन इसके लेआउट पैरेंट के रूप में उतना ही स्थान लगता है। यही कारण है कि नया नाम " match_parent " है


MATCH_PARENT और FILL_PARENT वही हैं?

हां, MATCH_PARENT और FILL_PARENT एक ही पूर्णांक मान (-1 यदि आप उत्सुक हैं) के लिए केवल अलग-अलग निरंतर नाम हैं, तो इसके माता-पिता के भीतर व्यू का लेआउट मोड निर्दिष्ट करने के लिए उपयोग किया जाता है।

तो MATCH_PARENT क्यों जोड़ा गया था?

एंड्रॉइड टीम ने पाया कि डेवलपर्स FILL_PARENT का गलत अर्थ FILL_PARENT रहे थे कि एक View अपने माता-पिता में शेष शेष स्थान को भर देगा। वास्तव में, FILL_PARENT निर्दिष्ट FILL_PARENT , View अपने माता-पिता के रूप में बड़ा होने का अनुरोध कर रहा है। इस प्रकार, ( MATCH_PARENT गाय द्वारा खुद को इस वीडियो में लगभग 10:56 बजे समझाया गया है) इसके उपयोग को स्पष्ट करने के लिए स्थिरांक का नाम बदलकर MATCH_PARENT रखा गया था।

ठीक है, मुझे लगता है कि कैसे FILL_PARENT/MATCH_PARENT काम करता है। अगर मैं एक या दूसरे का उपयोग करता हूं तो इससे कोई फर्क नहीं पड़ता?

FILL_PARENT को बहिष्कृत किया गया है। बहिष्कृत होने से यह शैतान नहीं बनता है, लेकिन अंततः यह दूर जायेगा। आपका आवेदन MATCH_PARENT का उपयोग कर भविष्य के सबूत है। बहिष्कृत विकल्प का उपयोग क्यों करें जब वर्तमान विकल्प बिल्कुल वही व्यवहार करता है?

इसके अलावा, FILL_PARENT वास्तव में भ्रामक है। मैंने व्यक्तिगत रूप से लोगों को उलझन में देखा है क्योंकि यह जिस तरह से सोचा था, वह काम नहीं करता है। असल में, मैंने FILL_PARENT और MATCH_PARENT दोनों का उपयोग करके एक ही टैग देखा है, क्योंकि डेवलपर ने सोचा (समझ में आता है) कि वे दो अलग-अलग लेआउट मोड थे।

आप कैसे भरने के लिए कोशिश कर सकते हैं?

यहां एक त्वरित उदाहरण दिया गया है कि MATCH_PARENT/FILL_PARENT भ्रम लोगों को बार-बार अपने डेस्क को अपने डेस्क पर लागू करने का कारण बन सकता है। सबसे पहले, कुछ View उदाहरणों वाला एक बहुत ही सरल लेआउट लें।

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <View
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="#FFFF00" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:background="@android:color/black"
        android:text="@string/hello_world"
        android:padding="50dp" />
    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FF0000" />

</LinearLayout>

match_parent का उपयोग fill_parent के स्थान पर किया जाता है और जहां तक ​​माता-पिता जाता है वहां जाने के लिए इसे सेट करता है। बस match_parent का उपयोग करें और fill_parent के बारे में भूल जाओ । मैं पूरी तरह से fill_parent ditched और सब कुछ सामान्य के रूप में सही है।

अधिक के लिए http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html देखें।







android-layout