我注意到奇怪的事情。在匿名类中,这个引用指向外部类。例如:
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
的引用。
为什么会这样?
答案 0 :(得分:2)
匿名类具有自动分配的名称 - $
前面加上外部类名称的序列号。
net.rhyboo.com.gl_test.MainActivity$1
。请注意,这不是MainActivity类,而是匿名类名。 $1
表示第一个内部类。
要从匿名内部类访问外部类,您应该添加外部类的名称。如果您的活动是MainActivity
,请使用:
MainActivity.this.setContentView(this.view);