1. ホーム
  2. android

[解決済み] Intellij IDEA/Android Studioでマージルートタグを使用したレイアウトをプレビューする

2022-04-22 23:31:59

質問

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 タブでは merge は常に FrameLayout として動作し、このようなものが表示されます。

(これはAndroid Studioで、Intellij IDEAも同じです。)

プレビューはレイアウトの開発速度を大幅に向上させるので、一部のレイアウトでもこのような大きな手助けがなくなるのは悲しいことです。プレビューがどのように解釈されるかを指定する方法があるかもしれません。 merge タグを特定のレイアウトで使用できますか?

どのように解決するのですか?

新しい 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 は、エディタでレイアウトが正しく表示されるように指定する必要があります。