我想弄清楚如何使用最少的样板代码重用或“别名”布局。
似乎Android documentation about layout aliases不正确,肯定会出现不一致。本文档的这一部分以下面的布局文件为例:
<resources>
<item name="main" type="layout">@layout/main_twopanes</item>
</resources>
如果我尝试编译它,我会收到Attribute is missing the Android namespace prefix
错误。即使将命名空间添加到resources
元素后,我也会得到error: Error: String types not allowed (at 'type' with value 'layout').
Elsewhere in the Android documentation,它们显示了一种不同的,看似倒置且不正确的别名布局方式:
要为现有布局创建别名,请使用该元素, 包裹在
<merge>
中。例如:<?xml version="1.0" encoding="utf-8"?> <merge> <include layout="@layout/main_ltr"/> </merge>
运行此操作会导致LogCat E/AndroidRuntime(1558): android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true
中出现以下错误。所以这个错误似乎强调了这个<include>
<merge>
对必定是错误的事实,因为它需要一个不必要的父View
。
最后有<merge>
documentation,这似乎与前一个方向相矛盾,没有提到顶级<merge><include/></merge>
的倒置形式。
为避免包含此类冗余视图组,您可以改为使用 元素作为可重用布局的根视图。对于 例如:
<merge xmlns:android="http://schemas.android.com/apk/res/android"> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/add"/> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/delete"/> </merge>
答案 0 :(得分:7)
第一种技术有效,您只需将<resources>
文件放在正确的文件夹中即可。它应该位于values
文件夹而不是layout
文件夹中,就像通过<include>
重复使用布局一样。
例如,假设您有一个名为editor.xml
的布局,它位于layout
文件夹中。假设您要在small
和normal
屏幕尺寸上使用专门的布局。如果您不想重复自己,只需将此布局复制并粘贴到layout-small
和layout-normal
文件夹中,并在每个文件夹中将其命名为editor.xml
。所以你有三个名为editor.xml
的文件。
如果您不想重复自己,可以将专用布局放在主layout
文件夹中,并将其命名为compact_editor.xml
。然后,您将在layout.xml
和values-small
文件夹中创建名为values-normal
的文件。每个文件都会显示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="editor" type="layout">@layout/compact_editor</item>
</resources>
我已就其他两个问题提交documentation issue。