Anteprima del layout con unisci tag radice in Intellij IDEA / Android Studio


158

Immaginiamo di sviluppare componenti composti basati su LinearLayout. Quindi, creiamo una classe come questa:

public class SomeView extends LinearLayout {
    public SomeView(Context context, AttributeSet attrs) {
        super(context, attrs);

        setOrientation(LinearLayout.VERTICAL);
        View.inflate(context, R.layout.somelayout, this);
    }
}

Se useremo LinearLayoutcome root di somelayout.xml, avremo un livello di visualizzazione extra, quindi usiamo il tag 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>

Ma nella scheda Anteprima di IDE merge agisce sempre come FrameLayout e vedremo qualcosa del genere: Anteprima con unione

(È Android Studio, Intellij IDEA è lo stesso, su Eclipse non lo so)

L'anteprima accelera molto lo sviluppo di layout, è triste perdere un grande aiuto anche per alcuni layout. Potrebbe esserci un modo per specificare, come l'anteprima dovrebbe interpretare il mergetag in un particolare layout?


1
Vorrei vedere anche questo supporto aggiunto.
Christopher Perry,

Questo potrebbe essere risolvibile qualche tempo in futuro dall'attributo strumenti. code.google.com/p/android/issues/detail?id=61652
Jonas

Risposte:


352

Esiste un nuovo attributo degli strumenti parentTag ( aggiunto in Android Studio 2.2 ) che è possibile utilizzare per specificare il tipo di layout per un tag di unione, che renderà il layout correttamente visualizzato nell'anteprima dell'editor di layout.

Quindi usando il tuo esempio:

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

Nota : entrambi android:layout_widthe android:layout_heightdevono essere specificati affinché il layout venga visualizzato correttamente nell'editor.


1
Qualcuno sa come mostrare correttamente l'anteprima quando aggiungi il tuo tag di visualizzazione personalizzato in un altro file di layout? <com.yourpackage.yourcustomview id="@+id/my_cust_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
Arst


2
Dato che stai usando strumenti puoi anche usare strumenti: layout_height = "match_parent"
cutiko

Perfetto! Grazie. +1
Carson J.

66

Modifica: risposta obsoleta. Vedi la risposta di starkej2.


Android Studio 0.5.8 ha aggiunto il supporto per gli strumenti: showIn. Usandolo è possibile visualizzare in anteprima i layout <unisci>.

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

layout / layout_merge.xml con strumenti: 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 con 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>

14
Buone notizie! Non molto utile per i componenti composti, perché è necessario aggiungere layout aggiuntivo solo per l'anteprima. Ma meglio di niente.
darja,

Qualche idea su qualcosa di simile è supportata in Eclipse?
Toguard

3
Puoi seguire un ticket, segnalato da uno sviluppatore di Google qui: code.google.com/p/android/issues/detail?id=61652
Neige

Ho impostato alcuni attributi sulla vista radice (in questo caso RelativeLayout) a livello di codice, come il riempimento. Ovviamente non vengono applicati in questo layout di supporto (perché usi una vista completamente diversa). L'unica soluzione era utilizzare l'intera vista personalizzata nel layout dell'helper.
Felix Edelmann,

non obsoleto potrebbe essere utilizzato quando non si desidera la visualizzazione generica
amorenew

-5

È anche possibile utilizzare la classe personalizzata come genitore invece di unire come

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

E poi gonfiare direttamente questo layout e trasmettere la vista dei risultati a SomeView. Android Studio controllerà direttamente la classe genitore SomeViewe gestirà l'anteprima come LinerLayout. È possibile utilizzare il onFinishInflate()metodo in SomeViewper associare le viste da findViewById(). Il vantaggio di questa soluzione è che puoi inserire tutte le definizioni di layout o la definizione di stile direttamente nel file di layout, non puoi utilizzare il metodo come setOrientation()nel codice.


2
Ciò introduce una ricorsione infinita e lo stack trabocca quando si tenta di visualizzare l'anteprima, facendo sì che l'intero Android Studio si blocchi per sempre.
mato,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.