调用接口时使用匿名类

时间:2011-06-14 14:26:30

标签: java android

我正在尝试在Android和Java中完全集成匿名类和接口的概念。在另一个帖子中给出了回复 关于类似的事情的问题:

getQuote = (Button) findViewById(R.id.quote);

getQuote.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        // Do something clever
    }
}

“在那里发送了一个匿名类,您也可以创建一个单独的类来实现OnClickListener并创建该类的实例并将其作为参数发送到setOnClickListener。” - 乔恩

我的问题是如果你去创建一个实现OnClickListener的单独类的漫长路线,代码会是什么样子? 我想如果我看到漫长的路线会更有意义。非常感谢!

4 个答案:

答案 0 :(得分:3)

//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());

请注意,显式定义的类的位置可能会有所不同。如果它包含在您的类中,您可能能够声明它static,或者您可能不会(根据聪明的东西需要访问实例成员)。

答案 1 :(得分:3)

class MyClass implements View.OnClickListener {

    @Override
    public void onClick(View v) {

        // Do something clever
    }

}

// Calling Code

MyClass listener = new MyClass();
getQuote.setOnClickListener(listener);

当你创建很多它们时,除了你声明和绑定它们之外不需要它们,那么匿名类被认为是一种更简洁的方法。

答案 2 :(得分: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
    }
}

匿名类的好处在于它们可以直接使用它们所定义的作用域中的所有实例字段和最终局部变量,从而节省了编写和维护所有参数传递和保持代码的工作量。 / p>

答案 3 :(得分:1)

好吧,你可以创建一个顶级类(新文件中的一个类),或者你可以将该类作为内部类嵌入到使用它的那个类中。

这是一个顶级课程:

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
        }
    }
}