在Intellij IDEA / Android Studio中使用合并根标签预览布局


158

假设我们正在开发基于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的“预览”选项卡中,合并始终充当FrameLayout,我们将看到类似的内容: 合并预览

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

预览大大加快了版面的开发速度,令人遗憾的是,即使对于某些版面,失去这么大的帮助。也许有一种方法可以指定,预览应如何解释merge特定布局中的标签?


1
我也希望添加此支持。
克里斯托弗·佩里

将来在某些时候可以通过tools属性解决。code.google.com/p/android/issues/detail?id=61652
乔纳斯(Jonas)

Answers:


352

有一个新的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必须按顺序指定布局在编辑器中正确显示。


1
当您在另一个布局文件中添加自定义视图标记时,有人知道如何正确显示预览吗?<com.yourpackage.yourcustomview id="@+id/my_cust_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
Arst


2
由于您使用的是工具,因此您也可以使用以下工具:layout_height =“ match_parent”
Cutiko

完善!谢谢。+1
Carson J.19年

66

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


Android Studio 0.5.8添加了对tools:showIn的支持。通过使用它,可以预览<merge>布局。

http://tools.android.com/recent/androidstudio058发布

使用tools:showIn的layout / layout_merge.xml:

<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>

14
好消息!对于复合组件来说不是很方便,因为我们只需要添加额外的布局即可预览。但总比没有好。
darja 2014年

Eclipse是否支持类似的想法?
Toguard

3
您可以在此处跟踪由Google开发人员举报的票证:code.google.com/p/android/issues/detail?id=61652
Neige

我以编程方式将一些属性设置为根视图(在本例中为RelativeLayout),例如padding。当然,它们不会应用在此帮助程序布局中(因为您使用的是其他视图)。唯一的解决方案是在助手布局中使用整个自定义视图。
Felix Edelmann

如果您不希望普通观看,可以使用它过时
amorenew

-5

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

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

然后直接膨胀此布局并将结果视图投射到SomeView。Android Studio将直接检查的父类SomeView并像一样处理预览LinerLayout。您可以使用中的onFinishInflate()方法SomeView通过绑定视图findViewById()。该解决方案的好处是您可以将所有布局定义或样式定义直接放置到布局文件中,而不能使用setOrientation()代码中的方法。


2
这引入了无限递归,并且在尝试预览时堆栈溢出,从而使整个Android Studio永远挂起。
mato 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.