为我的头衔道歉,我无法正确解决问题。
我看到OnCLickListener
以两种方式实施。第一个是通过表示您的类实现OnCLickListener
来完成的。第二个是通过让你自己声明来完成任务。
为什么在第一个选项中你可以简单地将this
作为setOnCLickListener
参数,但在第二个选项中你必须自己解决创建OnClickListener
对象的问题?
第一个:
public class WidgetConfig extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.widgetconfig);
Button b = (Button)findViewById(R.id.bwidgetconfig);
b.setOnClickListener(this);
}
//onClick defined outside of the onCreate
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
}
第二个:
public class WidgetConfig extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.widgetconfig);
Button b = (Button)findViewById(R.id.bwidgetconfig);
b.setOnClickListener(bListener);
}
private Button bListener = new OnClickListener(){
b.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//TO-DO
}
});
答案 0 :(得分:4)
在第一种方法中,整个Activity类实现OnClickListener
接口。您可以将每个视图的OnClickListener
设置为此,并在一种方法中接收所有点击事件,然后您可以在其中对其进行过滤并对其进行操作。
第二种方法使用匿名内部类来实现接口方法。通过使用此方法,您只能接收特定视图的事件。
在第一种方法中,您的整个班级使用OnClickListener
的一个实例,该实例会传递给您想要收听点击的所有视图。
第二种方法转换为:
Button.OnClickListener anonymous_listener = new Button.OnClickListener() { ... };
button.setOnClickListener(anonymous_listener);
也就是说,当您使用它时,它会动态创建并存储新的OnClickListener
实例。
答案 1 :(得分:1)
我通常采用第一种方式,因为它保存了一个对象。但是如果你需要实现许多监听器,那么为了保持代码更有条理和整洁,你可以考虑第二种方式。
答案 2 :(得分:1)
案例1 this
代表Activity
和OnClickListener
类型的对象。因此,当您在b.setOnClickListener(this)中传递this
时,它表示类型为“OnClickListener”的对象。
在案例2 中,您传递anonymous object
类型OnClickListener
。由于OnClickListener
是interface
,因此您必须在匿名对象中定义方法onClick
。
答案 3 :(得分:1)
如果您的onClickListener
需要访问 Activity 类的(大多数)方法和成员变量,那么可以使用第一种方法来简化代码。此外,如果您想以相同的方式处理所有“onClick
”,则可能更受欢迎。
否则,当您有许多按钮(或需要点击处理的其他类型的视图)时,应该采取第二个选项,并且所有这些选项都需要以不同的方式处理。在这种情况下,将活动处理onClick
用于一个按钮(视图)是没有意义的,其余部分由个别onClickListener
处理代码看起来不一致。
答案 4 :(得分:1)
您的 WidgetConfig 类“是一个”活动,因为它扩展了Activity。但是,您的 WidgetConfig 类“(也)是”OnClickListener
,因为它实现了接口。因此,当setOnClickListener()
要求您作为参数传入单击侦听器时,您可以传入“this
”,因为“this
”(即WidgetConfig)“是一个” onClickListener
。
使用匿名内部类,您可以获得设置和回调。但是,您应该阅读这个关于使用这些类的潜在缺陷:When exactly is it leak safe to use (anonymous) inner classes?