Попередній перегляд макета з об'єднанням корінкового тегу в 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 я не знаю)

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


1
Я також хотів би, щоб ця підтримка була додана.
Крістофер Перрі

Це може вирішити якийсь час у майбутньому за атрибутом інструментів. code.google.com/p/android/isissue/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"/>
Арст

1
Дивіться візуальну різницю raw.githubusercontent.com/nisrulz/android-tips-tricks/develop/…
Zar E Ahmer

2
Оскільки ви використовуєте інструменти, ви також можете використовувати інструменти: layout_height = "match_parent"
cutiko

Ідеально! Дякую. +1
Карсон Дж.

66

Редагувати: застаріла відповідь. Дивіться відповідь starkej2.


Android Studio 0.5.8 додала підтримку інструментів: showIn. За його допомогою можна попередньо переглядати <злиття> макети.

http://tools.android.com/recent/androidstudio058 вийшов

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/isissue/detail?id=61652
Нейге

Я задаю деякі атрибути кореневому виду (у даному випадку 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.