我有一个Activity
,只有一个按钮可以退出Activity
。
通过layout.xml
我必须将OnClick
事件设置为cmd_exit
并调用'this.finish()'才能正常工作
public void cmd_exit(View editLayout){
this.finish();
}
,但是当我添加OnClickListener
而不是
cmd_exit = (Button) this.findViewById(R.id.cmd_ExitApp);
cmd_exit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
this.finish()
会出错。它必须只有finish()
。
我理解finish()
课程中存在Activity
,所以我的问题是它是如何在第二个片段中发挥作用的?
答案 0 :(得分:3)
当您创建OnClickListener
作为匿名类时,this
关键字引用该侦听器实例而不是封闭类。您可以使用YourActivityClassName.this
代替。您也可以省略this
,因为OnClickListener
没有finish()
方法,因此将使用Activity
方法。
答案 1 :(得分:2)
在第一种情况下,this
引用Activity
实例。在第二种情况下,您有一个anonymous inner类,其实例化为new View.OnClickListener()
,其this
指的是该类的实例。每个匿名内部类都对它实例化的外部类有一个隐式引用。在调用finish()
时隐式使用该引用,即OuterClassName.this.finish()
。
它是如何在第二个片段中工作的?
编译器负责将对外部类实例的引用传递给内部类。它通过将对外部类实例的引用添加为构造函数参数来修改每个内部类的构造函数。
参考:Core Java Volume I - Fundamentals, 9th Edition,第6.4章:内部类,第309页
正如@Gabe Sechan指出的那样,为了引用匿名内部类中的外部类,请使用OuterClassName.this
。参考:How do you get a reference to the enclosing class from an anonymous inner class in Java?。