Предпросмотр макета с тегом корня слияния в Intellij IDEA/Android Studio

Предположим, что мы разрабатываем составной компонент на основе 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, и мы увидим что-то вроде этого: Preview with merge

(Это Android Studio, Intellij IDEA - это то же самое, о Eclipse, которого я не знаю)

Предварительный просмотр ускоряет разработку макетов много, печально потерять такую ​​большую помощь даже для некоторых макетов. Может быть, есть способ указать, как Preview должен интерпретировать тег merge в определенном макете?

Ответ 1

В атрибуте слияния добавлен новый атрибут 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.

Ответ 2

Изменить: устаревший ответ. См. Ответ от starkej2.


Android Studio 0.5.8 добавлена ​​поддержка инструментов: showIn. С его помощью можно просмотреть <merge> layouts.

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

layout/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 с include:

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

Ответ 3

Также возможно использовать пользовательский класс как родительский вместо объединения, например

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

И затем сразу раздуйте этот макет и покажите результат результата SomeView. Студия Android будет напрямую проверять родительский класс SomeView и обрабатывать предварительный просмотр, например LinerLayout. Вы можете использовать onFinishInflate() метод в SomeView для привязки просмотров findViewById(). Преимущество этого решения состоит в том, что вы можете поместить все определения макета или определение стиля непосредственно в файл макета, вы не можете использовать метод, например setOrientation() в коде.