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>.例如:Run Code Online (Sandbox Code Playgroud)<?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>文档,它似乎与前一个方向相矛盾,没有提到顶层的倒置形式<merge><include/></merge>.
为避免包含此类冗余视图组,您可以使用该元素作为可重用布局的根视图.例如:
Run Code Online (Sandbox Code Playgroud)<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>
第一种技术有效,您只需将<resources>文件放在正确的文件夹中即可.它应该位于values文件夹而不是layout文件夹中,就像重复使用布局一样<include>.
例如,假设您有一个名称editor.xml位于该layout文件夹中的布局.假设您要使用专门的布局small和normal屏幕尺寸.如果您不关心重复自己,只需将此布局复制并粘贴到layout-small和layout-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)
我已经提交了关于其他两个问题的文档问题.