Android 匿名类中的“this”

Android 匿名类中的“this”,android,class,this,anonymous,Android,Class,This,Anonymous,我注意到一件奇怪的事情。在匿名类中,此引用指向外部类。例如: public MyView view; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); toggleFullscreen(true); this.view=new MyView(this); setContentView(R.layout.activity_main);

我注意到一件奇怪的事情。在匿名类中,此引用指向外部类。例如:

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.setContentViewthis.view;-我遇到编译错误-无法解析方法setContentView。这是因为编译器认为这是对LoadGameDataTask.OnDataLoadedListener的引用


为什么会发生这种情况?

匿名类具有自动分配的名称-在外部类名前面加上一个序列号。 net.rhyboo.com.gl_test.main活动$1。注意,这不是MainActivity类,而是匿名类名$1表示第一个内部类

要从匿名内部类访问外部类,应添加外部类的名称。如果您的活动是MainActivity,则使用:


MainActivity.this.setContentViewthis.view

我建议不要在加载第一个视图后调用setContentView。如果您想显示不同的布局,建议只出于测试目的编辑片段,当然在生产中我会清理这些垃圾。它确实适用于MainActivity.this.Thank.this是活动类的特定属性吗?或者我可以在任何地方访问外部范围吗?这始终指向当前类。如果您在匿名内部类中,那么当前类就是匿名内部类。当您在一个内部类中时,也有一个外部作用域。要访问外部作用域,请在此=>main activity之前写入外部类名。谢谢各位。一些额外的符号可以让注释更长。我正在尝试,但上面说我必须至少拥有15个声誉。该死。忘了接受答案。对不起,耽搁了: