2012-03-03 4 views
11

в приложении Java android Как я могу получить доступ к переменным внешнего класса из внутреннего анонимного класса? Пример:переменные доступа внешнего класса в 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 
      ....... 

     } 
    }); 

ответ

19

Если диалог переменная является полем внешнего класса, вы можете использовать this префикс с именем внешнего класса (a qualified this):

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

В качестве альтернативы, если переменная dialiog является локальная переменная она должна быть помечена как окончательный:

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

Это правильный ответ, когда 'dialog' является полем внешнего класса. Я думаю, что в этом случае это локальная переменная в методе вокруг внутреннего класса. –

5

сделать внешнюю локальную переменную (dialog) final, чтобы вы могли ссылаться на него из внутреннего класса.

1

Если это локальная переменная (как предполагает подпись), для внутреннего класса должен быть final. Если это переменная-член, модификатор видимости должен быть по умолчанию (без модификатора) или выше (защищенный или общедоступный). С private -modifier, он все еще работает, но вы можете получить предупреждение (в зависимости от компилятора настроек):

доступ на чтение к охватывающему полю SomeClass.someField имитируется методом в синтетического аксессора

+1

Часть переменных-членов неверна. Внутренние классы могут получить доступ к закрытым членам охватывающего класса - компилятор создает скрытые аксессоры для таких членов. – casablanca

+0

@casablanca: true, я отредактировал ответ – esaj

Смежные вопросы