Предварительный просмотр макета с корневым тегом слияния в 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>

Но на вкладке Preview в IDE merge всегда действует как FrameLayout, и мы увидим что-то вроде этого: Предварительный просмотр с объединением

(Это Android Studio, Intellij IDEA точно такой же, про Eclipse я не знаю)

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

Darja
источник
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должны быть указаны для правильного отображения макета в редакторе.

starkej2
источник
1
Кто-нибудь знает, как правильно отобразить предварительный просмотр, когда вы добавляете свой пользовательский тег представления в другой файл макета? <com.yourpackage.yourcustomview id="@+id/my_cust_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
Arst
1
Смотрите визуальные различия raw.githubusercontent.com/nisrulz/android-tips-tricks/develop/…
Зар Э Амер
2
Поскольку вы используете инструменты, вы также можете использовать инструменты: layout_height = "match_parent"
cutiko
Отлично! Спасибо. +1
Карсон Дж.
66

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


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

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 с включением:

<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>
Jonas
источник
14
Хорошие новости! Не очень удобно для составных компонентов, потому что нам нужно добавить дополнительный макет только для предварительного просмотра. Но лучше, чем ничего.
Дарья
Любые идеи на что-то подобное поддерживается в Eclipse?
Toguard
3
Вы можете подписаться на тикет, о котором сообщил разработчик Google, здесь: code.google.com/p/android/issues/detail?id=61652
Neige
Я установил некоторые атрибуты для корневого представления (в данном случае RelativeLayout) программно, например, для заполнения. Конечно, они не применяются в этом вспомогательном макете (потому что вы используете совершенно другое представление). Единственное решение состояло в том, чтобы использовать весь пользовательский вид в макете помощника.
Феликс Эдельманн
не устаревший, его можно использовать, если вы не хотите, чтобы общий просмотр
amorenew
-5

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

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

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

Атом
источник
2
Это приводит к бесконечной рекурсии и переполнению стека при попытке предварительного просмотра, заставляя всю Android Studio зависать навсегда.
Матем