调用接口时使用匿名类

问题描述

| 我正在尝试完全集成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
        }
    }
}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...