Wyobraźmy sobie, że tworzymy złożony komponent oparty na LinearLayout. Tak więc tworzymy klasę w ten sposób:
public class SomeView extends LinearLayout {
public SomeView(Context context, AttributeSet attrs) {
super(context, attrs);
setOrientation(LinearLayout.VERTICAL);
View.inflate(context, R.layout.somelayout, this);
}
}
Jeśli użyjemy LinearLayout
jako katalogu głównego somelayout.xml
, będziemy mieć dodatkowy poziom widoku, więc używamy tagu scalającego:
<?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>
Ale na karcie Podgląd w scalaniu IDE zawsze działa jak FrameLayout, a zobaczymy coś takiego:
(To Android Studio, Intellij IDEA to to samo, o Eclipse nie wiem)
Podgląd bardzo przyspiesza tworzenie układów, szkoda tracić tak wielką pomoc nawet w przypadku niektórych układów. Może istnieje sposób na określenie, w jaki sposób Podgląd powinien interpretować merge
tag w danym układzie?
Odpowiedzi:
Istnieje nowy atrybut narzędzi parentTag ( dodany w Android Studio 2.2 ), którego można użyć do określenia typu układu dla znacznika scalającego, który sprawi, że układ będzie poprawnie renderowany w podglądzie edytora układu.
Więc używając twojego przykładu:
Uwaga : oba
android:layout_width
iandroid:layout_height
muszą być określone, aby układ był poprawnie wyświetlany w edytorze.źródło
<com.yourpackage.yourcustomview id="@+id/my_cust_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
Edycja: nieaktualna odpowiedź. Zobacz odpowiedź starkej2.
Android Studio 0.5.8 dodał obsługę narzędzi: showIn. Dzięki niej możliwy jest podgląd <merge> układów.
http://tools.android.com/recent/androidstudio058released
layout / layout_merge.xml z narzędziami: showIn:
layout / simple_relativelayout.xml z:
źródło
Możliwe jest również użycie niestandardowej klasy jako rodzica zamiast scalania
Następnie bezpośrednio nadmuchaj ten układ i rzutuj widok wyniku na
SomeView
. Studio Android bezpośrednio sprawdzi klasę nadrzędnąSomeView
i obsługuje podglądLinerLayout
. Możesz użyćonFinishInflate()
metody w,SomeView
aby powiązać widoki wedługfindViewById()
. Zaletą tego rozwiązania jest to, że możesz umieścić wszystkie definicje układu lub definicję stylu bezpośrednio w pliku układu, nie możesz użyć metody takiej jaksetOrientation()
w kodzie.źródło