доступ к переменным внешнего класса в Java - PullRequest
15 голосов
/ 03 марта 2012

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

        }
    });

Ответы [ 3 ]

23 голосов
/ 03 марта 2012

Если диалоговая переменная является полем внешнего класса, вы можете использовать this с префиксом внешнего имени класса ( и квалифицированным 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();
    }
});
5 голосов
/ 03 марта 2012

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

1 голос
/ 03 марта 2012

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

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

...