我最近进入Android,一直在看关于内部类的例子,但不太明白它们的用途是什么。它们通常在创建侦听器和不需要创建整个类时使用,对吗?也许有人可以用外行的术语向我解释一下,在这种情况下使用内部匿名类的替代方案是什么?这段代码:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
谢谢
另一个模式是使容器类本身成为侦听器。
public class MyClass implements View.OnClickListener {
@Override
public void onClick(View v) {
// Do something when button is clicked
}
public void initOrSomething() {
button.setOnClickListener(this);
}
}
但是,如果您有多个需要不同行为的按钮,则可能会遇到麻烦。
另一种方法是为每个按钮设置不同的侦听器类
public class Button1Listener implements View.OnClickListener {
@Override
public void onClick(View v) {
// Do something when button1 is clicked
}
}
public class Button2Listener implements View.OnClickListener {
@Override
public void onClick(View v) {
// Do something when button2 is clicked
}
}
button1.setOnClickListener(new Button1Listener());
button2.setOnClickListener(new Button2Listener());
匿名内部类只是第二种模式的更紧凑的表示。
编辑:这两种模式的变化都是可能的,其中检查View对象的内容以确定单击了哪个按钮,或者将构造函数参数传递给侦听器类以更改侦听器行为等。
它们通常在创建侦听器和不需要创建整个类时使用,对吗?
Android中的监听器,或其他情况下的其他接口。但本质上,就是这样。
在这种情况下,使用内部匿名类的替代方法是什么?
应该是创建一个实现这个接口的类,并将其作为参数提交。例如:
public class MyListener
implements View.OnClickListener
{
// implement onClick(), etc etc
}
// In code:
button.setOnClickListener(new MyListener(...));
这很简单:您所做的只是创建一个类。对于JVM(本例中是dalvik),类是它自己的编译单元(文件)、内部类还是匿名类(*)都无关紧要。所以你有三个同样有效的选项:
选项1您的示例:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
选项2命名内部类:
public MyActivity extends Activity {
static class MyListener implements View.OnClickListener {
@Override
public void onClick(View v) {
// do something
}
}
....
button.setOnClickListener(new MyListener());
}
和选项3不同文件:
文件MyListener.javapublic class MyListener implements View.OnClickListener {
@Override
public void onClick(View v) {
// do something
}
}
文件MyActivity.java import MyListener.java
public MyActivity extends Activity {
....
button.setOnClickListener(new MyListener());
}
你使用哪一个选项完全是主观的——取决于你的需要和用法,其中一个更有意义。然而,通常在UI监听器中,你不希望有任何逻辑与你正在编程的Activity的逻辑脱节。因此,您使用匿名类,因为所有代码都保存在一个地方,使其具有良好的可读性。