问题描述
|
我正在尝试完全集成Android和Java中匿名类和接口的概念。在另一个线程中给出了答复
关于以下问题:
getQuote = (Button) findViewById(R.id.quote);
getQuote.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do something clever
}
}
\“发送的是一个匿名类,您也可以创建一个单独的类,该类实现OnClickListener并创建该类的实例,然后将其作为setOnClickListener的参数发送。” – Jon
我的问题是,如果您花很长的时间创建一个单独的类来实现OnClickListener,那么代码将是什么样?
我认为,如果我看到了漫长的路,那会更有意义。非常感谢!
解决方法
class MyClass implements View.OnClickListener {
@Override
public void onClick(View v) {
// Do something clever
}
}
// Calling Code
MyClass listener = new MyClass();
getQuote.setOnClickListener(listener);
当您创建大量它们时,由于不需要声明和绑定它们,因此匿名类被认为是更整洁的方法。
, //somewhere in your class or even as its own top-level class:
static class MyOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
// Do something clever
}
}
getQuote.setOnClickListener(new MyOnClickListener());
请注意,显式定义的类的位置可以变化。如果它包含在您的类中,则可以将其声明为“ 3”,也可以不这样(取决于聪明的东西需要访问实例成员)。
, 它看起来像这样:
getQuote = (Button) findViewById(R.id.quote);
getQuote.setOnClickListener(new MyClickListener(param));
// in a separate class file:
public class MyClickListener extends View.OnClickListener{
private Param param;
public MyClickListener(Param p){
this.param = p;
}
@Override
public void onClick(View v) {
// Do something clever with param
}
}
匿名类的好处在于,它们可以直接使用其定义范围内的所有实例字段和最终局部变量,从而省去了编写和维护所有参数传递和保持代码的工作。
, 好吧,您可以创建一个顶级类(新文件中的一个类),也可以使用该类将其作为内部类嵌入其中。
这是顶级课程:
public class MyOnClickListener implements View.OnClickListener {
public void onClick(View v) {
//do something
}
}
这是一个嵌入式类:
public class MyActivity extends Activity {
class MyOnClickListener implements View.OnClickListener {
public void onClick(View v) {
//do something
}
}
}