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


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

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 зависать навсегда.
Матем
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.