使用< include>时,我无法覆盖属性在我的Android布局文件中。当我搜索错误时,我发现拒绝了Issue 2863:
“包含标签已损坏(覆盖布局参数无效)”
由于Romain表示这在测试套件及其示例中有效,我必须做错事。
我的项目组织如下:
res/layout
buttons.xml
res/layout-land
receipt.xml
res/layout-port
receipt.xml
buttons.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>
纵向和横向的receipt.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>
我错过了什么?
答案 0 :(得分:132)
我刚刚发现了这个问题。首先,您只能覆盖layout_ *属性,因此后台将不起作用。这是记录在案的行为,只是我的疏忽。
真正的问题在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);
}
}
如果&lt; include&gt;标签不包括两者 layout_width和layout_height,RuntimeException发生并以静默方式处理,甚至没有任何日志语句。
解决方案是在使用&lt; include&gt;时始终包含layout_width和layout_height。 tag,如果要覆盖任何layout_ *属性。
我的例子应该改为:
<include
android:id="@+id/buttons_override"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
layout="@layout/buttons"/>
答案 1 :(得分:10)
我提交了enhancement request以允许覆盖所有包含的属性:
假设我有两个相同的布局,而不是a的值
TextView
字段。目前,我要么修改布局了 运行时或复制XML。例如,将值为“hello”和“world”的两个参数传递给layout1:
<include layout="@layout/layout1a" params="textView=hello|editText=world" />
layout1a.xml:
<merge><TextView text="@param/textView"><EditText hint="@param/editText"></merge>
替代实现会破坏封装并允许 include语句用于覆盖以下值:
<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>
答案 2 :(得分:2)
我发现在Eclipse中使用GUI构建器时,我有时会错过包含android:id标记。确保(当我注意到)我从构建器添加到TextView中时,我在ListView布局中使用的id。
<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" />
...
而不是'假''假'我得到:)并且包括正常工作。