क्यों लेआउटइन्फ़्लैटर ने मेरे द्वारा निर्दिष्ट लेआउट_प्रदर्शन और लेआउट_हाइट लेआउट मापदंडों की उपेक्षा की है?


168

मुझे लेआउट में बहुत अधिक परेशानी हो रही है। उम्मीद के मुताबिक काम करने के लिए, और इसी तरह अन्य लोगों ने भी: रनटाइम के बारे में विचार जोड़ने के लिए लेआउटइनफ्लिटर का उपयोग कैसे करें?

क्यों लेआउटइन्फ़्लैटर ने मेरे द्वारा निर्दिष्ट लेआउट मापदंडों की उपेक्षा की है? उदाहरण के लिए layout_widthऔर layout_heightमेरे संसाधनों XML से मानों को सम्मानित क्यों नहीं किया जाता है?


सच्ची- क्या इससे मुझे तकलीफ हुई या मैंने गलत जगह चुन ली? बस मैंने सोचा कि मैं अपने परिणाम साझा करूँगा। ट्यूटोरियल
मानने

3
faq में पहले प्रश्न के अंतिम पैराग्राफ को देखें। इसे प्रश्न के रूप में पोस्ट करें और फिर उत्तर के रूप में ट्यूटोरियल पोस्ट करें। बेशक, आप इस प्रश्न को काट सकते हैं और उत्तर में ट्यूटोरियल को चिपका सकते हैं। यदि आप इसे ठीक करते हैं तो मैं उत्थान करूंगा।
बिगस्टोन्स

जवाबों:


381

मैंने इस मुद्दे की जांच की है, जिसमें LayoutInflater डॉक्स का जिक्र है और एक छोटा सा नमूना प्रदर्शन परियोजना स्थापित की है। निम्न ट्यूटोरियल दिखाता है कि लेआउट का उपयोग गतिशील रूप से कैसे किया जाए LayoutInflater

आरंभ करने से पहले हम देखते हैं कि LayoutInflater.inflate()पैरामीटर क्या दिखते हैं:

  • संसाधन : एक XML लेआउट संसाधन को लोड करने के लिए आईडी (जैसे, R.layout.main_page)
  • रूट : उत्पन्न पदानुक्रम (यदि attachToRootहै true) के माता-पिता होने का वैकल्पिक दृश्य , या बस एक वस्तु है जो LayoutParamsलौटी पदानुक्रम (यदि attachToRootहै false) के मूल के लिए मानों का एक सेट प्रदान करता है ।
  • संलग्नक : क्या फुलाया गया पदानुक्रम रूट पैरामीटर से जुड़ा होना चाहिए? यदि गलत है, तो रूट का उपयोग केवल LayoutParamsXML में रूट दृश्य के लिए सही उपवर्ग बनाने के लिए किया जाता है ।

  • रिटर्न : फुलाया पदानुक्रम का मूल दृश्य। अगर जड़ की आपूर्ति की गई थी और attachToRootहै true, तो यह जड़ है; अन्यथा यह फुली हुई XML फ़ाइल की जड़ है।

अब नमूना लेआउट और कोड के लिए।

मुख्य लेआउट ( main.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</LinearLayout>

इस कंटेनर में जोड़ा गया एक अलग TextView है, जो छोटे लाल वर्ग के रूप में दिखाई देता है यदि लेआउट पैरामीटर सफलतापूर्वक XML ( red.xml) से लागू होते हैं

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="25dp"
    android:layout_height="25dp"
    android:background="#ff0000"
    android:text="red" />

अब LayoutInflaterकॉल मापदंडों के कई रूपों के साथ प्रयोग किया जाता है

public class InflaterTest extends Activity {

    private View view;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);
      ViewGroup parent = (ViewGroup) findViewById(R.id.container);

      // result: layout_height=wrap_content layout_width=match_parent
      view = LayoutInflater.from(this).inflate(R.layout.red, null);
      parent.addView(view);

      // result: layout_height=100 layout_width=100
      view = LayoutInflater.from(this).inflate(R.layout.red, null);
      parent.addView(view, 100, 100);

      // result: layout_height=25dp layout_width=25dp
      // view=textView due to attachRoot=false
      view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
      parent.addView(view);

      // result: layout_height=25dp layout_width=25dp 
      // parent.addView not necessary as this is already done by attachRoot=true
      // view=root due to parent supplied as hierarchy root and attachRoot=true
      view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
    }
}

कोड में पैरामीटर भिन्नता के वास्तविक परिणाम प्रलेखित हैं।

SYNOPSIS: कॉलिंग LayoutInflaterबढ़ कॉल करने के लिए जड़ सुराग को निर्दिष्ट एक्सएमएल से लेआउट मानकों की अनदेखी के बिना। रूट के साथ फुलाते हुए कॉल करना समान नहीं है nullऔर attachRoot=trueलेआउट मापदंडों को लोड करता है, लेकिन रूट ऑब्जेक्ट को फिर से लौटाता है, जो लोड किए गए ऑब्जेक्ट में आगे के लेआउट परिवर्तन को रोकता है (जब तक कि आप इसका उपयोग नहीं कर सकते findViewById())। कॉलिंग कन्वेंशन जो आप सबसे अधिक उपयोग करना चाहते हैं, इसलिए यह एक है:

loadedView = LayoutInflater.from(context)
                .inflate(R.layout.layout_to_load, parent, false);

लेआउट मुद्दों के साथ मदद करने के लिए, लेआउट इंस्पेक्टर की अत्यधिक अनुशंसा की जाती है।


20
बहुत बढ़िया जवाब। 3 साल तक एंड्रॉइड पर काम किया और गिनती की और अभी भी इससे कुछ सीखना था।
रूबेन स्क्रैटन ने

नमस्ते, R.layout के साथ खिलवाड़ करने के बजाय जावा कोड के साथ एक ही काम करने का कोई तरीका है। क्योंकि मेरे पास लेआउट नहीं है। मैंने जावा कोड के साथ दृश्य बनाया है और मैं 300 बार के लिए एक ही दृश्य जोड़ना चाहता हूं।
राज

1
@andig: Activityके उपवर्ग है Contextऔर जवाब का उदाहरण के दायरे में हैं Activity, तो यह सरल मैं प्रतिस्थापित करने के लिए, getBaseContext()के साथ thisके रूप में, इस उत्तर के लिए, यह बराबर है।
मार्सिन ऑर्लोव्स्की

5
कंटेनर में "match_parent" सेट करने के लिए लेआउट_ एक्सपोज़र और लेआउट_हाइट है; फिर टिप्पणी "// परिणाम: लेआउट_हाइट = रैप_ कॉन्टेंट लेआउट_ एक्सपोज़र = माचिस_परेंट"। क्या मुझे sth याद आ रहा है?
मैरियन पाडज़िओच

1
शोध करने और परिणाम साझा करने के लिए धन्यवाद! साथ ही, मैरियन का दूसरा प्रश्न।
लार्स

5

andig सही है कि आपके लेआउट_परमों की अनदेखी करने वाले LayoutInflater के लिए एक सामान्य कारण होगा क्योंकि एक रूट निर्दिष्ट नहीं किया गया था। बहुत से लोग सोचते हैं कि आप जड़ के लिए अशक्त हो सकते हैं। यह कुछ परिदृश्यों जैसे कि संवाद के लिए स्वीकार्य है, जहां आपके पास सृजन के समय रूट तक पहुंच नहीं है। हालाँकि, पालन करने का एक अच्छा नियम यह है कि यदि आपके पास रूट है, तो इसे LayoutInflater को दें।

मैंने इस बारे में एक गहन ब्लॉग पोस्ट लिखा है, जिसे आप यहां देख सकते हैं:

https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/


1
This is acceptable for a few scenarios such as a dialogवह सब जो मुझे चाहिए था
धोखेबाज़ विकास

0

ऊपर मुख्य उत्तर के लिए जोड़ना चाहते हैं,
मैं इसे पालन करने की कोशिश की, लेकिन मेरे recyclerView एक स्क्रीन पर हर आइटम को फैलाने के लिए शुरू किया
मुझे लक्ष्य तक पहुंचने के लिए फुलाए जाने के बाद अगली पंक्ति को जोड़ना पड़ा

itemLayoutView.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));

मैंने पहले ही इन params को xml से जोड़ दिया, लेकिन यह सही ढंग से काम नहीं कर पाया
और इस लाइन के साथ सब ठीक है

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