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