在 Intellij IDEA/Android Studio 中使用 merge root 标签预览布局

让我们假设我们正在基于 LinearLayout 开发复合组件:

public class SomeView extends LinearLayout {
public SomeView(Context context, AttributeSet attrs) {
super(context, attrs);


setOrientation(LinearLayout.VERTICAL);
View.inflate(context, R.layout.somelayout, this);
}
}

如果我们使用 LinearLayout作为 somelayout.xml的根,我们将有额外的视图级别,所以我们使用 merge 标签:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Some text"
android:textSize="20sp"/>


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Some other text"/>
</merge>

但是在 IDE 的 Preview 选项卡 merge 总是充当 FrameLayout,我们将看到类似的东西: Preview with merge

(它是 Android Studio,Intellij IDEA 也是一样,关于 Eclipse 我不知道)

预览加速开发布局很多,这是可悲的失去这么大的帮助,即使是一些布局。也许有一种方法可以指定,预览应该如何解释 merge标签在特定的布局?

24840 次浏览

编辑: 过时的答案。参见 starkej2的答案。


Android Studio 0.5.8增加了对工具的支持: showIn。

Http://tools.android.com/recent/androidstudio058released

用工具: showIn:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="@layout/simple_relativelayout">


......


</merge>

Layp/simple _ relativelayout.xml,其中包括:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">


<include layout="@layout/layout_merge"/>


</RelativeLayout>

也可以使用自定义类作为父类而不是像

<com.mycompany.SomeView xmlns:android="http://schemas.android.com/apk/res/android">
...
</com.mycompany.SomeView>

然后直接将此布局充气并将结果视图转换为 SomeView。 Android 工作室将直接检查 SomeView的父类并像 LinerLayout一样处理预览。 可以在 SomeView中使用 onFinishInflate()方法通过 findViewById()绑定视图。 这种解决方案的好处是,您可以将所有布局定义或样式定义直接放到布局文件中,您不能在代码中使用类似 setOrientation()的方法。

有一个新的 ParentTag 工具属性(在 Android Studio 2.2中添加)可用于指定合并标记的布局类型,这将使布局在布局编辑器预览中正确呈现。

所以用你的例子:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:parentTag="LinearLayout"
tools:orientation="horizontal">


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Some text"
android:textSize="20sp"/>


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Some other text"/>
</merge>

注意 : 为了在编辑器中正确显示布局,必须同时指定 android:layout_widthandroid:layout_height