«это» в анонимном классе

#android #class #this #anonymous

#Android #класс #это #Аноним

Вопрос:

Я заметил странную вещь.В анонимном классе эта ссылка указывает на внешний класс.Например:

 public MyView view;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    toggleFullscreen(true);
    this.view=new MyView(this);
    setContentView(R.layout.activity_main);
    //load data
    LoadGameDataTask task=new LoadGameDataTask(..loading params);

    task.setListener(new LoadGameDataTask.OnDataLoadedListener() {
        @Override
        public void OnDataLoaded(GameData data) {
    //this -reference to activity
            Log.d("load","completed,this:" this.toString());// D/load: completed,this:net.rhyboo.com.gl_test.MainActivity$1@34dfbb38
            //this.setContentView(this.view);
        }
    });
    task.execute();
}
 

Если я выполню этот код — я смогу увидеть this указания на мою активность после завершения загрузки данных.Однако, если я раскомментирую this.setContentView(this.view); — я получил ошибку компиляции — cannot resolve method setContentView . Это потому, что компилятор считает, что this это ссылка LoadGameDataTask.OnDataLoadedListener .

Почему это происходит?

Комментарии:

1. Я бы не советовал вызывать setContentView после загрузки первого представления. Если вы хотите показать разные макеты, рекомендуется использовать фрагменты

2. Это только для целей тестирования, конечно, в процессе производства я уберу это дерьмо.

Ответ №1:

Анонимным классам автоматически присваиваются имена — $ перед именем внешнего класса добавляется порядковый номер. net.rhyboo.com.gl_test.MainActivity$1 . Обратите внимание, что это не класс MainActivity, а имя анонимного класса. $1 означает первый внутренний класс.

Чтобы получить доступ к внешнему классу из анонимного внутреннего класса, вы должны добавить имя внешнего класса. Если ваша активность MainActivity затем использует:

MainActivity.this.setContentView(this.view);

Комментарии:

1. Действительно, это работает с MainActivity.this. Спасибо. Является ли свойство «это» специфичным для класса activity? Или я могу получить доступ к внешней области в любом месте?

2. this всегда указывает на текущий класс. Если вы находитесь внутри анонимного внутреннего класса, то текущий класс является анонимным внутренним классом. Когда вы находитесь внутри внутреннего класса, также существует внешняя область. Чтобы получить доступ к внешней области, вы пишете имя внешнего класса перед this => MainActivity.this

3. спасибо, ребята. Несколько дополнительных символов, чтобы сделать комментарий длиннее

4. Я пытаюсь, но в нем говорится, что у меня должна быть репутация не менее 15.

5. Черт. Забыл принять ответ. Извините за задержку 🙂