对Android中的xml实现onClick有点疑问,实现的原理是怎样的?
java中实现是这样的:
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
xml结合java的实现
样式比较好看,可是他没有实现OnClickListener的接口呢
android:onClick="function"
public void function(View view){}
如果它每部实现了OnClickListener奇怪的是,Activity.class 和View跨类了呢?
答案:
认真查看了源代码
case R.styleable.View_onClick:
if (context.isRestricted()) {
throw new IllegalStateException("The android:onClick attribute cannot "
+ "be used within a restricted context");
}
final String handlerName = a.getString(attr);
if (handlerName != null) {
setOnClickListener(new OnClickListener() {
private Method mHandler;
public void onClick(View v) {
if (mHandler == null) {
try {
mHandler = getContext().getClass().getMethod(handlerName,
View.class);
} catch (NoSuchMethodException e) {
int id = getId();
String idText = id == NO_ID ? "" : " with id '"
+ getContext().getResources().getResourceEntryName(
id) + "'";
throw new IllegalStateException("Could not find a method " +
handlerName + "(View) in the activity "
+ getContext().getClass() + " for onClick handler"
+ " on view " + View.this.getClass() + idText, e);
}
}
try {
mHandler.invoke(getContext(), View.this);
} catch (IllegalAccessException e) {
throw new IllegalStateException("Could not execute non "
+ "public method of the activity", e);
} catch (InvocationTargetException e) {
throw new IllegalStateException("Could not execute "
+ "method of the activity", e);
}
}
});
}
break;
关键是:
mHandler = getContext().getClass().getMethod(handlerName,
View.class);
mHandler.invoke(getContext(), View.this);
总结:映射真的不可忽视呀