有四种方法可以为可点击的视图(例如按钮)添加onClick监听器:
- 在布局文件中设置onClick属性,该属性指向活动中的某个方法。
- 创建一个匿名内部类。
- 将onClick监听器分配给私有成员变量。
- 让Activity上下文实现onClick监听器接口。
那么我的问题是,如何选择这些实现技术中的一种?是否根据特定条件有最佳实践,还是仅仅是程序员的偏好问题?
有四种方法可以为可点击的视图(例如按钮)添加onClick监听器:
那么我的问题是,如何选择这些实现技术中的一种?是否根据特定条件有最佳实践,还是仅仅是程序员的偏好问题?
这里我们使用所谓的回调模式。
public class Button {
private Callback callback;
public Button(Callback callback) {
this.callback = callback;
}
public void update() {
// Check if clicked..
callback.onClick(this);
}
public interface Callback {
public void onClick(Button Button);
}
}
Button b = new Button(new Callback() {
@Override
public void onClick(Button b) {
System.out.println("Clicked");
}
});
易读性取决于处理程序的大小,小逻辑可以内联,但对于较大的代码块,请考虑使用第三和第四维。
setOnClickListener()
的设置方法,该方法期望接口View.OnClickListener。顺便说一下,相同的概念也适用于片段与主机活动之间的聊天(示例)。 - Maxim GonClick
属性,因为它将布局与特定的Activity绑定在一起(必须通过反射找到方法)。它在Fragments上不起作用。OnClickListener
,则选项3可能更有优势。有四种方法可以使用OnClickListener
。
在方法调用处定义OnClickListener
。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = findViewById(R.id.myButton);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// do something
}
});
}
}
首先,避免使用这种方法的原因是它会使onCreate
方法变得混乱。当您想要观察多个视图的点击事件时,这一点变得更加明显。
其次,避免使用这种方法是因为如果多个按钮应该执行相同的操作,它不会促进代码重用。
第二种方式与第一种方式几乎相同,只是将实现分配给了类中的字段。
public class MainActivity extends AppCompatActivity {
private View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// do something
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = findViewById(R.id.myButton);
button.setOnClickListener(clickListener);
}
}
这种方法与第一种方法基本相同,唯一的优点是可以重复使用该方法来处理多个按钮。
这种方法是通过声明一个内部类来实现OnClickListener
。如果将其多次使用,则最好将实例定义为字段。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = findViewById(R.id.myButton);
button.setOnClickListener(new ButtonClick());
}
class ButtonClick implements View.OnClickListener {
@Override
public void onClick(View v) {
// do something
}
}
}
这种方法的优点在于它有助于组织代码。您可以轻松地折叠此内部类并在不需要查看它时忘记它。
另一个好处是它可以转换成公共类,并在其他应用程序领域中重复使用。
第四种方法涉及将Activity实现OnClickListener
。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = findViewById(R.id.myButton);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// do something
}
}
setOnClickListener
时需要传递this
活动。switch()
或if()
语句。这不会执行,因为它会浪费每次按钮单击的周期或多个周期。onClick
的方法的接口。
这些方法之间存在一些差异,但您应根据代码和需求选择自己的方法