里面有View
类中声明的接口,它的OnClickListener
,它看起来像这样在View.java
来源:
/**
* Interface definition for a callback to be invoked when a view is clicked.
*/
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
通常你会创建一个类,并让它实现这个接口:
public void MyClass implements View.OnClickListener {
@Override
public void onClick(View view) {
// do stuff
}
}
但有时你不需要这个类在一个单独的文件。相反,你可以创建匿名内部类,它就像创建新类,其中只有方法是从界面中指定的一个:
new View.OnClickListener() {
@Override
public void onClick(View v){
ourMessage.setText(“The button got tapped”);
}
}
然后,您可以使用这个类处处需要View.OnClickListener
接口的实例。
还值得一提的是,匿名内部类将持有对您创建它的类的引用。因此,这将是合法有效:
public class MyClass {
private int clicksCount = 0;
private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
clicksCount += 1;
}
}
}
在这里,您可以访问clicksCount
场,这是MyClass
领域甚至实现OnClickListener
内部类。注意 - 如果你想访问一个变量,你需要添加final
修饰符:
public void testMethod(final int canAccess, int cantAccess) {
final String test = otherView.getText().toString();
myView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Cannot access cantAccess, because it's not final
if (test.length == 0) { // can access
// do something
}
}
}
阅读关于匿名内部类,你会明白。 –