2012-02-08 8 views
28

Ho solo bisogno di qualcuno che mi dica se ho capito correttamente quando usare <include> e quando <merge>.Alcuni possono chiarire l'uso di <include> e <merge>

Quindi, faccio un layout dell'intestazione, che voglio includere in qualche altro schema XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
      <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"   
     android:text="Header text" /> 
</LinearLayout> 

E io includerlo in qualche altro XML in questo modo (che è piuttosto semplice):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
       <include android:id="@+id/header" layout="@layout/top" 
      android:layout_width="fill_parent" android:layout_height="wrap_content" 
      /> 
</LinearLayout> 

Questo funzionerà bene, nessun problema al riguardo. Ma per ottimizzare il codice, devo usare <merge> nel layout che viene incluso. Così il top layout non dovrebbe avere un tag <LinearLayout> ma deve assomigliare a questo:

<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
    <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"   
      android:text="Header text" /> 
</merge> 

Ho capito correttamente questo?

+1

Ya sembra buono. Anche se, nella mia esperienza, non ho bisogno di unire. Non posso semplicemente posizionare la visualizzazione del testo nel suo file xml e includere quel file. Nessuna unione necessaria. – AedonEtLIRA

+0

Sì, funzionerà, ma è davvero ** sicuro di usarlo in questo modo perché gli sviluppatori di Google non hanno mai suggerito tale pratica. Ho paura di cosa succederebbe se decidessero di cambiare qualcosa che riconosce il tag di fusione. – sandalone

+1

@sandalone come tutto ciò che è necessario aggiornare l'xml ... al nuovo standard. Ci sono state tonnellate di metodi ammortizzati in Android fin dall'inizio, quindi questo non è davvero un problema più di qualcosa che si dovrebbe essere consapevoli di. – Jonny2Plates

risposta

19

Sì, avete capito bene. merge viene utilizzato come elemento pseudo genitore per ridurre il numero di livelli negli alberi di visualizzazione. Basta controllare questo link, fornisce un'ottima spiegazione di merge.
Nel file di intestazione

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
       <include android:id="@+id/header" layout="@layout/top" 
      android:layout_width="fill_parent" android:layout_height="wrap_content" 
      /> 
</LinearLayout> 

<LinearLayot> non fa alcuna differenza quando il file è incluso nel altro file che hai menzionato. Quindi è una buona cosa usare merge invece.
Poiché in XML è necessario utilizzare un elemento padre singolo e il resto degli elementi XML deve essere incluso in esso, è necessario utilizzare merge come elemento padre singolo e evitare l'aggiunta di layout padre non necessario.
Basta evitare l'unione quando si desidera applicare un layout in modo diverso rispetto al layout definito nel file in cui il contenuto è inclinato.

+0

Grazie. Il link che hai suggerito mi ha confuso nella testa :), e volevo ricontrollare con voi ragazzi. – sandalone

+0

@bergnam: Ci scusiamo per la confusione. L'ho trovato davvero utile. Condividerò se mi sono imbattuto in qualsiasi altro buon link. – xyz

+0

Va bene. Dopo tutto, è il collegamento ufficiale e tutti gli altri testi sono basati su quello. – sandalone

18

Da quanto ho capito imposta l'elemento di unione come elemento superiore nella gerarchia della vista. Includi metterà semplicemente l'intero viewgroup lì dentro. Quindi, utilizzando il vostro esempio la gerarchia vista dovrebbe essere simile:

Con unione:

LinearLayout (root) 
| 
TextView 

con includono:

LinearLayout (root) 
| 
LinearLayout 
| 
TextView 

in modo da avere un LinearLayout supplementare nella gerarchia della vista che non si bisogno. Tuttavia, a volte hai bisogno di quella vista intermedia. Nel tuo caso, non lo faresti, dal momento che entrambi i LinearLayout hanno gli stessi parametri di layout e nessun'altra differenza.

+0

Un buon punto, ma questi casi sono piuttosto rari. Upvote per quello – sandalone

0

Il tag <merge /> consente di eliminare i gruppi di viste ridondanti nella gerarchia di viste quando include un layout all'interno di un altro. Ad esempio, se il layout principale è un LinearLayout verticale in cui due viste consecutive possono essere riutilizzate in più layout, il layout riutilizzabile in cui si collocano le due viste richiede la propria vista radice. Tuttavia, l'utilizzo di un altro LinearLayout come root per il layout riutilizzabile comporterebbe un LinearLayout verticale all'interno di un LinearLayout verticale. LinearLayout nidificato non ha altro scopo se non quello di rallentare le prestazioni dell'interfaccia utente.

Per evitare di includere un gruppo di viste ridondante, è possibile utilizzare l'elemento <merge> come visualizzazione radice per il layout riutilizzabile. Per esempio:

<Button 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/add"/> 

<Button 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/delete"/> 

Ora, quando si include questo layout in un altro layout (utilizzando il tag), il sistema ignora l'elemento e pone i due pulsanti direttamente nel layout, al posto del etichetta.