Does Android XML Layout's 'include' Tag Really Work?

前端 未结 3 1541
臣服心动
臣服心动 2020-12-04 09:16

I am unable to override attributes when using in my Android layout files. When I searched for bugs, I found Declined Issue 2863:

\"include tag is bro

相关标签:
3条回答
  • 2020-12-04 09:50

    I submitted an enhancement request to allow all included attributes to be overridden:

    Suppose I have two identical layouts other than the values of a TextView field. Presently, I either have modify the layout at runtime or duplicate the XML.

    For example to pass two parameters with values "hello" and "world" to layout1:

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

    layout1a.xml:

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

    An alternate implementation would break encapsulation and would allow the include statement to override values like:

    <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>

    0 讨论(0)
  • 2020-12-04 10:05

    I just found the issue. First, you can only override layout_* attributes, so the background won't work. That is documented behavior and simply an oversight on my part.

    The real problem is found in 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);
       }
    }
    

    If the <include> tag does not include both layout_width and layout_height, the RuntimeException occurs and is silently handled, without any log statement even.

    The solution is to always include both layout_width and layout_height when using the <include> tag, if you want to override any of the layout_* attributes.

    My example should change to:

    <include
          android:id="@+id/buttons_override"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          layout="@layout/buttons"/>
    
    0 讨论(0)
  • 2020-12-04 10:07

    I found I sometimes miss including the android:id tag when using the GUI builder in Eclipse. Making sure (when I notice) that I add into a TextView from the builder , the id I'm using in the ListView layout.

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

    becomes

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

    Instead of getting 'false' 'false' I get :) and includes working ok.

    0 讨论(0)
提交回复
热议问题