क्या Android XML लेआउट के 'सच में काम टैग' शामिल है?


84

मैं अपने Android लेआउट फ़ाइलों में <शामिल> का उपयोग करते समय विशेषताओं को ओवरराइड करने में असमर्थ हूं। जब मैंने बग की खोज की, तो मुझे डिस्बिल्ड इश्यू 2863 मिला :

"टैग शामिल है टूटा हुआ है (ओवरराइडिंग लेआउट परमेस कभी काम नहीं करता है)"

चूँकि रोमेन यह परीक्षण सूट और उसके उदाहरणों में करते हैं, इसलिए मुझे कुछ गलत करना चाहिए।

मेरी परियोजना इस तरह आयोजित की जाती है:

res/layout
  buttons.xml

res/layout-land
  receipt.xml

res/layout-port
  receipt.xml

इस बटन में कुछ इस तरह है:

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

  <Button .../>

  <Button .../>
</LinearLayout>

और पोर्ट्रेट और लैंडस्केप रसीद। xml फाइलें कुछ इस तरह दिखती हैं:

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

  ...

  <!-- Overridden attributes never work. Nor do attributes like
       the red background, which is specified here. -->
  <include
      android:id="@+id/buttons_override"
      android:background="#ff0000"
      android:layout_width="fill_parent"
      layout="@layout/buttons"/>

</LinearLayout>

मैं क्या खो रहा हूँ?


जब आप उपयोग करने का प्रयास करते हैं, तो यह प्रश्न Android डेवलपर टूल द्वारा संदर्भित किया जाता है, जो समर्थित नहीं है।
थॉमस डब्ल्यू

जवाबों:


132

मुझे बस मुद्दा मिल गया। सबसे पहले, आप केवल लेआउट_ * विशेषताओं को ओवरराइड कर सकते हैं, इसलिए पृष्ठभूमि काम नहीं करेगी। यह प्रलेखित व्यवहार है और मेरे हिस्से का निरीक्षण है।

असली समस्या LayoutInflater.java में पाई गई है:

// We try to load the layout params set in the <include /> tag. If
// they don't exist, we will rely on the layout params set in the
// included XML file.
// During a layoutparams generation, a runtime exception is thrown
// if either layout_width or layout_height is missing. We catch
// this exception and set localParams accordingly: true means we
// successfully loaded layout params from the <include /> tag,
// false means we need to rely on the included layout params.
ViewGroup.LayoutParams params = null;
try {
   params = group.generateLayoutParams(attrs);
} catch (RuntimeException e) {
   params = group.generateLayoutParams(childAttrs);
} finally {
   if (params != null) {
     view.setLayoutParams(params);
   }
}

यदि <शामिल करें> टैग में लेआउट_विज़न और लेआउट_हाइट दोनों शामिल नहीं हैं , तो RuntimeException होती है और चुपचाप संभाला जाता है, बिना किसी लॉग स्टेटमेंट के भी।

इसका समाधान हमेशा <शामिल> टैग का उपयोग करते समय लेआउट_आर्डर और लेआउट_हाइट दोनों को शामिल करना है, यदि आप किसी भी लेआउट_ * विशेषताओं को ओवरराइड करना चाहते हैं।

मेरा उदाहरण बदल जाना चाहिए:

<include
      android:id="@+id/buttons_override"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      layout="@layout/buttons"/>

33
यह मज़ाकीय है। मैं यह काम करने में कभी सक्षम नहीं रहा, और मैंने आयामों को ओवरराइड करने की कोशिश करते हुए भी दस्तावेज़ को ऊँचाई और चौड़ाई दोनों की आवश्यकता के रूप में देखा, जो मुझे लगा कि ऊँचाई और चौड़ाई है। हालाँकि, मैं ओवरराइड करने की कोशिश कर रहा था, जो मार्जिन है, जो वास्तव में एक आयाम नहीं है। जब मुझे उन सभी या यहां तक ​​कि उन दोनों में से किसी को भी निर्दिष्ट करने की आवश्यकता होती है जब मैं बदलना चाहता हूं? ग्र्र, एंड्रॉइड, कभी-कभी आप मुझे बहुत ज्यादा निराश करते हैं।
आर्टेम रसाकोवस्की

1
FYI करें Android Lint आपको एक त्रुटि देगा (लेआउट पैरामीटर Layout_height को नजरअंदाज कर दिया गया जब तक कि लेआउट_ बैंडविड्थ को <<भी शामिल करें> टैग पर निर्दिष्ट नहीं किया जाता है) यदि आप ऊँचाई और चौड़ाई दोनों विशेषताओं को ओवरराइड नहीं कर रहे हैं
बाइनरी

10

मैंने सभी शामिल विशेषताओं को ओवरराइड करने की अनुमति देने के लिए एक वृद्धि अनुरोध प्रस्तुत किया:

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

उदाहरण के लिए दो मानदंड "हैलो" और "दुनिया" को लेआउट 1 से पास करना:

<include layout="@layout/layout1a" params="textView=hello|editText=world" />

layout1a.xml:

<merge><TextView text="@param/textView"><EditText hint="@param/editText"></merge>

एक वैकल्पिक कार्यान्वयन एन्कैप्सुलेशन को तोड़ देगा और इसमें शामिल मानों को ओवरराइड करने की अनुमति देगा जैसे:

<include layout="@layout/layout1b" overrides="@id/textView.text=hello|@id/editText.hint=world" />

layout1b.xml:

<merge><TextView id="@+id/textView"><EditText hint="@+id/editText"></merge>


1
नए डेटाबाइंडिंग सामान को ध्यान में रखते हुए <include>, अब और भी अधिक बार उपयोग किया जाता है, attr ओवरराइडिंग वास्तव में एक विशेषता होनी चाहिए
दिमित्री ग्रायाज़िन

1

मैंने पाया कि मुझे कभी-कभी एंड्रॉइड सहित याद आती है: ग्रहण में जीयूआई बिल्डर का उपयोग करते समय आईडी टैग। यह सुनिश्चित करना (जब मैं नोटिस करता हूं) कि मैं बिल्डर से एक टेक्स्ट व्यू में जोड़ रहा हूं, तो मैं जिस सूची का उपयोग कर रहा हूं उसे लिस्ट व्यू लेआउट में देखें।

<TextView android:text="@+id/textView1"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" />
...

हो जाता है

<TextView android:id="@+id/textView1"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" />
...

'झूठी' 'झूठी' होने के बजाय मुझे :) मिलता है और इसमें ठीक काम करना शामिल है।

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