2016-02-12 12 views
9

Quando si legge il codice sorgente di Bar in dalla libreria di design, ho trovato questo sort of XML layout:Qual è tag <view/> XML nei layout

<view xmlns:android="http://schemas.android.com/apk/res/android" 
     class="android.support.design.widget.Snackbar$SnackbarLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     style="@style/Widget.Design.Snackbar" /> 

non ho mai visto questo tipo di XML con solo un tag <view/> (con bassa V, in modo da non è la classe View).

La mia prima risposta è che funziona come il tag <fragment/>, indicando che si dovrebbe creare una visualizzazione personalizzata in base all'attributo class, ma perché usare questa notazione quando poteva semplicemente scrivere:

<android.support.design.widget.Snackbar.SnackbarLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     style="@style/Widget.Design.Snackbar" /> 

??

Grazie mille

+1

Questo sarebbe sufficiente per voi per capire: http://developer.android.com/guide/topics/ui/custom-components.html#modifying –

risposta

7

In realtà entrambi sono uguali. Nel primo XML si dice che sarebbe una visione di tipo android.support.design.widget.Snackbar$SnackbarLayout (definito nella proprietà class)

<view xmlns:android="http://schemas.android.com/apk/res/android" 
    class="android.support.design.widget.Snackbar$SnackbarLayout" 

Nel secondo è direttamente dichiarando utilizzando la classe personalizzata.

secondo formato può essere utilizzato solo se la visualizzazione personalizzata non è definito come una classe interna

From Android Documentation

Ora abbiamo il nostro componente personalizzato, ma come possiamo usarlo? Nell'esempio NotePad, il componente personalizzato viene utilizzato direttamente dal layout dichiarativo, quindi dai un'occhiata a note_editor.xml nella cartella res/layout.

Il componente personalizzato viene creato come vista generica nell'XML e la classe viene specificata utilizzando il pacchetto completo. Nota anche che la classe interna che abbiamo definito è referenziata usando la notazione MyEditText di NoteEditor $ che è un modo standard per riferirsi a classi interne nel linguaggio di programmazione Java.

Se il componente di visualizzazione personalizzato non è definito come una classe interna, è possibile, in alternativa, dichiarare il componente Visualizza con il nome dell'elemento XML ed escludere l'attributo di classe. Ad esempio:

Si noti che la classe MyEditText è ora un file di classe separato. Quando la classe è annidata nella classe NoteEditor, questa tecnica non funzionerà.

Gli altri attributi e parametri nella definizione sono quelli passati al costruttore del componente personalizzato e quindi passati al costruttore EditText, in modo che siano gli stessi parametri che usereste per una vista EditText. Notare che è possibile aggiungere anche i propri parametri, e lo toccheremo di nuovo qui sotto.

E questo è tutto quello che c'è da fare. Certo, si tratta di un caso semplice, ma è questo il punto: la creazione di componenti personalizzati è tanto complicata quanto è necessario.

Un componente più sofisticato può sovrascrivere ancora di più su ... metodi e introdurre alcuni dei propri metodi di supporto, personalizzando sostanzialmente le sue proprietà e il suo comportamento. L'unico limite è la tua immaginazione e ciò di cui hai bisogno è il componente da fare.

+0

Quindi non vi è alcuna differenza tecnica tra entrambe le notazioni? – pdegand59

+0

Oh, sì, c'è una differenza. aggiornando la mia risposta. – Rohit5k2

+1

Oh grazie per il riferimento del documento. La parte divertente è: creare una vista personalizzata usando una classe interiore. Utilizzando l'interfaccia di trascinamento della modifica XML di AS, prova ad aggiungere la tua nuova vista personalizzata. AS lo aggiungerà nell'XML utilizzando il secondo metodo che tecnicamente non funzionerà. ^^ – pdegand59

Problemi correlati