#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. Черт. Забыл принять ответ. Извините за задержку 🙂