有关布局别名的Android文档不正确?

Jef*_*rod 7 android android-layout

我想弄清楚如何使用最少的样板代码重用或"别名"布局.

关于布局别名Android文档似乎不正确,当然看起来不一致.本部分文档以以下布局文件为例:

<resources>
    <item name="main" type="layout">@layout/main_twopanes</item>
</resources>
Run Code Online (Sandbox Code Playgroud)

如果我尝试编译它,我会收到一个Attribute is missing the Android namespace prefix错误.即使在将resources元文件添加到元素之后,我也会得到error: Error: String types not allowed (at 'type' with value 'layout').

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

要为现有布局创建别名,请使用包含在a中的元素<merge>.例如:

<?xml version="1.0" encoding="utf-8"?>
<merge>
    <include layout="@layout/main_ltr"/>
</merge>
Run Code Online (Sandbox Code Playgroud)

运行此操作会导致LogCat中出现以下错误E/AndroidRuntime(1558): android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true.因此,这个错误似乎强化了这一<include> <merge>对必定是错误的事实,因为它需要一个不必要的父母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>
Run Code Online (Sandbox Code Playgroud)

Jef*_*rod 7

第一种技术有效,您只需将<resources>文件放在正确的文件夹中即可.它应该位于values文件夹而不是layout文件夹中,就像重复使用布局一样<include>.

例如,假设您有一个名称editor.xml位于该layout文件夹中的布局.假设您要使用专门的布局smallnormal屏幕尺寸.如果您不关心重复自己,只需将此布局复制并粘贴到layout-smalllayout-normal文件夹中,并editor.xml在每个文件夹中命名.所以你有三个名字的文件editor.xml.

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="editor" type="layout">@layout/compact_editor</item>
</resources>
Run Code Online (Sandbox Code Playgroud)

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