button1 = (Button) findByView(R.id.button1) ;
button1.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
}
}
那么这段代码发生了什么?
Button1
是对xml文件中button1对象的引用。
button1
对象有一个成员对象setOnClickListener
我从它的名字我假设将事件初始化为按钮或其他东西。但它收到View.OnClicListener()
个对象。
我很困惑.onClick收到一个View对象,所以onClickListener
不是一个对象返回一个View对象?我根本得不到它。
有人可以解释该行中发生的事情View.onClickListener()
这是另一种说new this
的方法吗?
答案 0 :(得分:23)
View.OnClickListener
is an interface,你没有调用它,但是创建了一个新实例(new View.OnClickListener()
是对构造函数的调用)
您创建的实例是anonymous class implements
View.OnClickListener
,位于new View.OnClickListener()
任何实现View.OnClickListener
的类都必须实现其中声明的方法(例如onClick)
setOnClickListener
只保存对您提供的View.OnClickListener实例的引用,当有人单击该按钮时,您设置的侦听器的onClick
方法将被调用。
答案 1 :(得分:2)
OnClickListener是一个接口。接口提供了一组其他类可以实现的方法。 http://download.oracle.com/javase/tutorial/java/concepts/interface.html
你可以有另一个类(Like和adapter),它扩展了OnClickListener,然后你的Adapter类可以添加方法“OnClick(View v)”,它也可以处理Click事件。或者您可以使用您发布的代码,您只需创建一个实现OnClickListener的匿名类。
-Woody
答案 2 :(得分:2)
Android代码适用于基于事件的响应。代码块如下:
找到已添加到活动布局的按钮,并将其分配给本地变量:
button1 = (Button) findByView(R.id.button1);
设置按钮的on click侦听器。这是一个在按钮注册事件时将调用的类。这个类是在这里构造的,它是匿名的,因为你没有将它分配给变量,但android会跟踪引用。
按钮事件总是由于被按下,因此当按钮注册它已被按下时,它将通知onClickListener类,偶数发生,并作为视图传递给自己。 onClickListener构造为:
new View.OnClickListener()
{
public void onClick(View v)
{
}
}
侦听器使用onClick方法来处理事件(在这种情况下,按下按钮)。所以,你会把你想要执行的代码放在那个方法中。
要直接回答您的问题,onClickListere是一个匿名类,它定义onClick方法,该方法将处理按钮事件。