2011-11-13 17 views
19

Ho la mia visualizzazione personalizzata estesa da View. Ci sono 3 vista costruttori:quale costruttore chiamare per la visualizzazione?

  1. View(Context context, AttributeSet attrs, int defStyle)
  2. View(Context context, AttributeSet attrs)
  3. View(Context context)

Da mia attività io chiamo std.setContentView(R.layout.main). Il secondo costruttore viene chiamato a mio avviso. Perché il secondo? Come sapere in anticipo quale sarà chiamato e perché?

risposta

41

Dal sito degli sviluppatori Android in documentazione per Vista:

public View (Context context)

costruttore semplice da usare durante la creazione di una vista dal codice.

Quindi questo costruttore è ciò che è possibile utilizzare per creare una vista in Java. Non verrà chiamato quando si gonfia da XML.

public View (Context context, AttributeSet attrs)

Constructor che viene chiamato quando gonfiare una vista da XML. Questo viene chiamato quando una vista viene costruita da un file XML, fornendo gli attributi che sono stati specificati nel file XML. Questa versione utilizza uno stile predefinito di 0, quindi gli unici valori di attributo applicati sono quelli presenti nel tema del contesto e nell'attributo attributo specificato.

Il metodo onFinishInflate() verrà chiamato dopo l'aggiunta di tutti i bambini.

Quindi questo costruttore verrà chiamato quando si gonfia una vista da XML quando non si specifica uno stile.

public View (Context context, AttributeSet attrs, int defStyle)

Eseguire l'inflazione da XML e applicare uno stile di base specifica classe. Questo costruttore di View consente alle sottoclassi di utilizzare il proprio stile di base quando si gonfiano. Ad esempio, un costruttore della classe Button chiamerebbe questa versione del costruttore super-classe e fornirà R.attr.buttonStyle per defStyle; questo consente allo stile del pulsante del tema di modificare tutti gli attributi della vista di base (in particolare lo sfondo) e gli attributi della classe Button.

è necessario implementare tutti questi costruttori, ma si può mettere tutto il lavoro nella terza chiamando this(context, null) e this(context, attrs, 0) per i primi due, rispettivamente.

+2

super (context, attrs) e super (context, attrs, 0) funziona in modo diverso per me. Il primo è ok, ma il secondo rimuove lo stile originale da una vista, quindi non posso usarlo (contesto, attrs, 0). È un bug nelle versioni più recenti di Android? – broot

+1

Si prega di non fare cascate chiamate del costruttore, vedere la mia risposta qui sotto. – Jin

+0

Suppongo che questa sia la risposta di Jin: http://stackoverflow.com/a/34301725/326874 – aeracode

Problemi correlati