9

我想弄清楚如何用最少的样板代码重用或“别名”布局。

似乎有关布局别名的 Android 文档不正确,而且肯定显得不一致。这部分文档显示了以下布局文件作为示例:

<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').

在 Android 文档的其他地方,它们显示了一种不同且看似颠倒且不正确的别名布局方式:

要为现有布局创建别名,请使用包含在<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>对一定是错误的事实,因为它需要一个不必要的 parent View

最后是<merge>文档,这似乎与前一个方向相矛盾,没有提到顶级的倒置形式<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>
4

1 回答 1

8

第一种技术有效,您只需将<resources>文件放在正确的文件夹中。它应该在values文件夹中,而不是在layout通过<include>.

例如,假设您有一个名为的布局editor.xml,它位于layout文件夹中。假设您想在屏幕尺寸small上使用专门的布局。normal如果您不关心重复自己,您只需将此布局复制并粘贴到layout-smalland文件夹中,并在每个文件夹中layout-normal命名。editor.xml因此,您将拥有三个名为editor.xml.

如果您不想重复自己,可以将专用布局放在主layout文件夹中并命名,例如compact_editor.xml. 然后,您将创建一个名为and文件夹layout.xml的文件。每个文件将显示:values-smallvalues-normal

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="editor" type="layout">@layout/compact_editor</item>
</resources>

我已经提交了关于其他两个问题的文档问题。

于 2012-10-09T16:10:57.550 回答