Android中的OnClickListener接口

5

我是一个新手程序员,对Android编程只有非常基础的知识。在学习Java时,我了解到接口是不能被实例化的,并且在Java中,new是一个关键字,表示创建一个实例。在Android中,我遇到了以下代码:

public class MyActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

    setContentView(R.layout.mylayout);
    findViewById(R.id.button1).setOnClickListener(mButton1_OnClickListener);
  }  

  //On click listener for button1
  final OnClickListener mButton1_OnClickListener = new OnClickListener() {
    public void onClick(final View v) {
        //Inform the user the button has been clicked
        Toast.makeText(this, "Button1 clicked.", Toast.LENGTH_SHORT).show();               
    }
  };
}

以上代码中的 OnClickListener 是一个公共接口,onClick(final View v) 是一个抽象方法。问题是:既然 OnClickListener 是一个接口,如何在上面的示例中使用 new 关键字创建其实例?

或者您可以将此“接口”继承到一个“类=Activity”中,并使它表现得像一个“OnClick”处理程序。 - hackp0int
我没听懂,请您能再解释一下吗? - ARP
“接口”给继承它的对象一个行为。这样你就可以决定你的活动是否可以给“接口”一个“点击行为”。 - hackp0int
那么上述代码看起来会像这样:public class MyActivity extends Activity implements OnClickListener { public void onClick(final View v) { //通知用户按钮已被点击 Toast.makeText(this, "Button1 clicked.", Toast.LENGTH_SHORT).show();
}} 我正确吗?
- ARP
3个回答

5

我看了一下Java文档,它说匿名内部类使我们能够在声明和实例化类的同时进行。但是我不明白,接口如何与匿名内部类相关联。 - ARP
看这里,你正在给出接口的引用,然后创建一个类的新对象,而该类将在下一步中创建。就是这样。有点棘手,请查阅任何教程以便更好地理解。 - rupesh
感谢提供的链接,真的帮了很大的忙。 - ARP

1

经过长时间的学习,我能够对匿名类进行澄清。基本上,匿名代表着没有名称,因此没有任何名称的类是匿名类。 例如:

  final OnClickListener mButton1_OnClickListener = new OnClickListener() {
        public void onClick(final View v) {
            //Inform the user the button has been clicked
            Toast.makeText(this, "Button1 clicked.", Toast.LENGTH_SHORT).show();               
        }
      };

让我们以上面的代码为例。这是一个匿名实现,其中mButton1_OnClickListener是一个匿名类的对象,并且该匿名类实现了OnClickListener接口。 类似的例子 - 匿名类如何使用"extends"或"implements"?

1
它被称为“匿名内部类”。这个概念完全不同。在幕后,编译器会自动创建一个新的类,该类实现了该“onClickListener”接口。
以下链接详细回答了您的问题。 从OnClickListener接口创建对象

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接