Podgląd układu z tagiem głównym scalania w Intellij IDEA / Android Studio

158

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 LinearLayoutjako 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: Podgląd ze scaleniem

(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ć mergetag w danym układzie?

darja
źródło
1
Chciałbym również dodać tę obsługę.
Christopher Perry
W przyszłości można to rozwiązać za pomocą atrybutu tools. code.google.com/p/android/issues/detail?id=61652
Jonas

Odpowiedzi:

352

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:

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

Uwaga : oba android:layout_widthi android:layout_heightmuszą być określone, aby układ był poprawnie wyświetlany w edytorze.

starkej2
źródło
1
Czy ktoś wie, jak poprawnie wyświetlić podgląd po dodaniu własnego tagu widoku w innym pliku układu? <com.yourpackage.yourcustomview id="@+id/my_cust_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
Arst
1
Zobacz różnicę wizualną raw.githubusercontent.com/nisrulz/android-tips-tricks/develop/…
Zar E Ahmer
2
Ponieważ używasz narzędzi, równie dobrze możesz użyć narzędzi: layout_height = "match_parent"
cutiko
Idealny! Dzięki. +1
Carson J.
66

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:

<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 z:

<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>
Jonas
źródło
14
Dobre wieści! Niezbyt przydatne w przypadku komponentów złożonych, ponieważ musimy dodać dodatkowy układ tylko do podglądu. Ale lepsze niż nic.
darja
Jakieś pomysły na coś podobnego są obsługiwane w Eclipse?
Toguard
3
Możesz śledzić zgłoszenie zgłoszone przez programistę Google tutaj: code.google.com/p/android/issues/detail?id=61652
Neige
Ustawiłem niektóre atrybuty w widoku głównym (w tym przypadku RelativeLayout) programowo, na przykład dopełnienie. Oczywiście nie są one stosowane w tym układzie pomocniczym (ponieważ używasz zupełnie innego widoku). Jedynym rozwiązaniem było użycie całego widoku niestandardowego w układzie pomocniczym.
Felix Edelmann
nie jest przestarzały, może być używany, gdy nie chcesz ogólnego przeglądania
amorenew
-5

Możliwe jest również użycie niestandardowej klasy jako rodzica zamiast scalania

<com.mycompany.SomeView xmlns:android="http://schemas.android.com/apk/res/android">
...
</com.mycompany.SomeView>

Następnie bezpośrednio nadmuchaj ten układ i rzutuj widok wyniku na SomeView. Studio Android bezpośrednio sprawdzi klasę nadrzędną SomeViewi obsługuje podgląd LinerLayout. Możesz użyć onFinishInflate()metody w, SomeViewaby powiązać widoki według findViewById(). 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 jak setOrientation()w kodzie.

Atom
źródło
2
Wprowadza to nieskończoną rekurencję i przepełnienie stosu podczas próby podglądu, przez co całe Android Studio zawiesi się na zawsze.
mato