173

假设我们正在开发基于 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,我们将有额外的视图级别,所以我们使用合并标签:

<?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 选项卡中,始终充当 FrameLayout,我们会看到类似的内容: 合并预览

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

预览大大加快了布局的开发速度,即使对于某些布局也失去了如此大的帮助,这很可悲。可能有一种方法可以指定,预览应该如何解释merge特定布局中的标签?

4

3 回答 3

400

有一个新的 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

于 2016-09-16T20:36:30.580 回答
67

编辑:过时的答案。请参阅starkej2 的回答。


Android Studio 0.5.8 添加了对工具的支持:showIn。通过使用它可以预览 <合并> 布局。

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

带有工具的布局/layout_merge.xml: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>

layout/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>
于 2014-05-09T08:56:12.057 回答
-6

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

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

然后直接膨胀这个布局并将结果视图转换为SomeView. Android Studio 将直接检查父类SomeView并处理预览,如LinerLayout. 您可以使用onFinishInflate()中的方法SomeView来绑定视图findViewById()。这个解决方案的好处是你可以将所有的布局定义或样式定义直接放到布局文件中,你不能像setOrientation()在代码中那样使用方法。

于 2014-09-06T08:27:01.427 回答