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、追加のビューレベルがあるため、マージタグを使用します。

<?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
ジョナス

回答:


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_widthとの両方をandroid:layout_height指定する必要があります。


1
カスタムビュータグを別のレイアウトファイルに追加するときにプレビューを正しく表示する方法を知っている人はいますか?<com.yourpackage.yourcustomview id="@+id/my_cust_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
2017


2
ツールを使用しているため、tools:layout_height = "match_parent"を使用することもできます
cutiko

パーフェクト!ありがとう。+1
カーソンJ.

66

編集:古い回答。starkej2による回答を参照してください。


Android Studio 0.5.8にtools:showInのサポートが追加されました。これを使用することで、<マージ>レイアウトをプレビューできます。

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

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>

includeを含む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でサポートされていますか?
2014

3
ここで、Googleデベロッパーから報告されたチケットをフォローできます:code.google.com/p/android/issues/detail?id
Neige

パディングのように、プログラムによっていくつかの属性をルートビュー(この場合はRelativeLayout)に設定します。もちろん、これらはこのヘルパーレイアウトには適用されません(完全に他のビューを使用しているため)。唯一の解決策は、ヘルパーレイアウトでカスタムビュー全体を使用することでした。
Felix Edelmann 2016

時代遅れではないあなたは、一般的な閲覧をしたくないとき、それを使用することができる
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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.