裏面有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
}
}
}
閱讀關於匿名內部類,你會明白。 –