93

Wyobraźmy sobie, że tworzymy komponent złożony oparty na LinearLayout. Tak, tworzymy klasę tak:Podgląd układu z głównym tagiem root w Intellij IDEA/Android Studio

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 pierwiastka somelayout.xml, będziemy mieli dodatkowy poziom widok, więc używamy scalić tag:

<?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 w Zakładka podgląd w IDE seryjnej zawsze działa jako FrameLayout, a my zobaczymy coś takiego: Preview with merge

(to jest Android Studio, IntelliJ IDEA jest tak samo, o Eclipse nie wiem)

Podgląd przyspiesza projektowanie układów, to smutne, stracić tak wielką pomoc, nawet w przypadku niektórych układów. Być może istnieje sposób na określenie, w jaki sposób Podgląd powinien interpretować znacznik merge w określonym układzie?

+0

Chciałbym również zobaczyć tę obsługę. –

+0

To może być rozwiązane w przyszłości przez atrybut tools. https://code.google.com/p/android/issues/detail?id = 61652 – Jonas

Odpowiedz

183

Istnieje nowy atrybut narzędzi parentTag (added in Android Studio 2.2), za pomocą którego można określić typ układu dla znacznika scalania, co spowoduje poprawne renderowanie układu w podglądzie edytora układu.

Więc używając 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: Zarówno android:layout_width i android:layout_height musi być określona w celu układ poprawnie wyświetlić w edytorze.

+2

Idealny! Dzięki :) – friederbluemle

+2

To powinna być poprawna odpowiedź –

+0

Działa to jak urok. Dzięki. +1 – Kashmir

61

Edytuj: Nieaktualna odpowiedź. Zobacz odpowiedź starkej2.


Android Studio 0.5.8 dodano obsługę narzędzi: showIn. Korzystając z niego można wyświetlić podgląd scalonych układów> <.

http://tools.android.com/recent/androidstudio058released

układ/layout_merge.xml z narzędzi: Pokazujesz:

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

układ/simple_relativelayout.xml z innymi:

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

Dobra wiadomość! Niezbyt przydatny w przypadku złożonych komponentów, ponieważ musimy dodać dodatkowy układ tylko do podglądu. Ale lepiej niż nic. – darja

+0

Wszelkie pomysły dotyczące czegoś podobnego są obsługiwane w środowisku Eclipse? – Toguard

+3

Możesz śledzić zgłoszenie zgłaszane przez programistę Google tutaj: https://code.google.com/p/android/issues/detail?id=61652 – Neige

-4

możliwe jest również stosowanie niestandardowych klasy jako rodzic zamiast scalania jak

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

Następnie bezpośrednio nadmuchaj ten układ i rzuć widok wyniku na SomeView. Android studio bezpośrednio sprawdzi klasę rodzicielską SomeView i obejrzy podgląd podobny do LinerLayout. Możesz użyć metody onFinishInflate() w SomeView, aby powiązać widoki przez findViewById(). Zaletą tego rozwiązania jest możliwość umieszczenia wszystkich definicji layoutów lub definicji stylu bezpośrednio w pliku układu, nie można używać w kodzie metody takiej jak setOrientation().

+1

Wprowadza nieskończoną rekursję, a stos przepełnia się podczas próby podglądu, co powoduje, że całe Studio Android zawiesza się na zawsze. – mato