Переменные доступа внешнего класса в Java

в приложении Java android, как я могу получить доступ к переменным внешнего класса из внутреннего анонимного класса? Пример:

    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
           .......

        }
    });

Ответ 1

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

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

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

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();
    }
});

Ответ 2

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

Ответ 3

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

Чтение доступа к закрывающему полю SomeClass.someField эмулируется синтетический метод доступа