2012-09-26 8 views
7

Nella precedente esercitazione di programmazione Android, pagina 192, vediamo un'implementazione di LunchList#onOptionsItemSelected. All'interno di questa implementazione vediamo due Intent s passati a startActivity: uno il cui costruttore è passato LunchList.this, l'altro il cui costruttore è passato this.Qual è la differenza tra il passaggio di questo e ClassName.questo da un gestore eventi quando viene passato al costruttore Intent?

Qual è la differenza?

See lines 78 - 91 here. Si noti come onOptionsItemSelected non è dichiarato all'interno di una classe interna.

In Android/Java il valore di this cambia nel contesto di gestori di eventi o associazione di funzioni tramite riflessione? È possibile superare le istanze Intentthis?

risposta

10

In Java, this fa riferimento alla classe contenente e ClassName.this fa riferimento alla prima classe contenente il cui nome è ClassName. I gestori di eventi sono in genere scritti come classi interne anonime, quindi se si desidera fare riferimento alla classe contenente il gestore eventi (e non alla classe del gestore eventi), è necessario specificare ContainingClass.this, non this.

Riferimento: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.4

+0

Ho aggiunto un collegamento alla fonte in questione. Si noti che 'onOptionsItemSelected' non è dichiarato all'interno di una classe interna. – ybakos

+1

In tal caso, il nome della classe è superfluo/ridondante. – JimN

2

Quando si crea un Intent all'interno di un Inner Class uso ClassName.this (qui className deve essere la Classe di attività Nome) e se la creazione di Intent all'interno di una classe Activity è possibile utilizzare this.

+0

Ho aggiunto un collegamento all'origine in questione. Si noti che 'onOptionsItemSelected' non è dichiarato all'interno di una classe interna – ybakos

+0

Puoi anche usare' this' al posto di 'LunchList.this'. – Nishant

+0

Significato, non vi è alcuna differenza in questo caso? – ybakos

1

Per questo esempio non farà alcuna differenza come in entrambi condizionare la classe che inizierà l'attività rimarrà lo stesso. Il primo parametro dell'Intento fa riferimento al contesto della classe da cui verrà avviata l'attività e da dove verranno passati i dati del bundle.