Давайте представим, что мы разрабатываем составной компонент на основе 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
тег в конкретном макете?
Ответы:
Существует новый атрибут инструментов parentTag ( добавлен в Android Studio 2.2 ), который можно использовать для указания типа макета для тега слияния, что позволит правильно отображать макет в окне предварительного просмотра редактора макетов.
Итак, используя ваш пример:
Примечание . Оба
android:layout_width
иandroid:layout_height
должны быть указаны для правильного отображения макета в редакторе.источник
<com.yourpackage.yourcustomview id="@+id/my_cust_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
Изменить: устаревший ответ. Смотрите ответ по starkej2.
В Android Studio 0.5.8 добавлена поддержка инструментов: showIn. С его помощью можно просматривать макеты <merge>.
http://tools.android.com/recent/androidstudio058released
layout / layout_merge.xml с инструментами: showIn:
layout / simple_relativelayout.xml с включением:
источник
Также возможно использовать пользовательский класс как родительский вместо слияния типа
А затем непосредственно надуйте этот макет и приведите результат просмотра к
SomeView
. Студия Android будет непосредственно проверять родительский классSomeView
и обрабатывать предварительный просмотр, какLinerLayout
. Вы можете использоватьonFinishInflate()
метод в,SomeView
чтобы связать представленияfindViewById()
. Преимущество этого решения заключается в том, что вы можете поместить все определения макета или определения стиля непосредственно в файл макета, вы не можете использовать метод, какsetOrientation()
в коде.источник