2012-03-03 23 views
11

nell'applicazione Android Java come posso accedere alle variabili della classe esterna dalla classe anonima interna? Esempio:variabili di accesso della classe esterna in Java

ProgressDialog dialog = new ProgressDialog(this); 
    ..... 
    send.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) { 

      //here i'd like to do something with **dialog** variable 
      ....... 

     } 
    }); 

risposta

19

Se la variabile di dialogo è un campo della classe esterna, è possibile utilizzare this prefisso il nome della classe esterna (a qualified this):

send.setOnClickListener(new View.OnClickListener() 
{ 
    public void onClick(View v) { 
     ProgressDialog dlg = OuterClass.this.dialog; 
     ....... 
    } 
}); 

In alternativa, se la variabile dialiog è una variabile locale ha bisogno di essere contrassegnato come finale:

final ProgressDialog dialog = new ProgressDialog(this); 
..... 
send.setOnClickListener(new View.OnClickListener() 
{ 
    public void onClick(View v) { 
     // The dialog variable is in scope here ... 
     dialog.someMethod(); 
    } 
}); 
+0

Questa è la risposta corretta quando 'dialog' è un campo della classe esterna. Penso che in questo caso sia una variabile locale nel metodo attorno alla classe interiore. –

5

Fai la variabile locale esterno (dialog) final in modo da poter fare riferimento ad esso dalla classe interna.

1

Se è una variabile locale (come suggerisce la firma), è necessario che sia final affinché la classe interna possa accedervi. Se è una variabile membro, il modificatore di visibilità deve essere predefinito (nessun modificatore) o superiore (protetto o pubblico). Con private -modifier, funziona ancora, ma si potrebbe ottenere un avviso (a seconda delle impostazioni del compilatore-):

accesso in lettura che racchiude campo SomeClass.someField è emulato da un metodo di accesso sintetico

+1

La parte relativa alle variabili membro non è vera. Le classi interne possono accedere ai membri privati ​​della classe che li include - il compilatore genera accessors nascosti per tali membri. – casablanca

+0

@casablanca: vero, ho modificato la risposta – esaj

Problemi correlati