标题
[android/Functions.java]Functions.SetOnClick 设置一个按钮[其实是 view]的 onClick 事件
clq
浏览(485) +
2021-08-07 15:13:57 发表
编辑
关键字:
[android/Functions.java]Functions.SetOnClick 设置一个按钮[其实是 view]的 onClick 事件
两个版本,有什么区别我忘记了。应该只是应用到的类不一样而已,应该是用哪一个都可以的。
//设置一个按钮[其实是 view]的 onClick 事件,来自据说是 xml 设计器的源码,因为java不能直接将函数作为参数传递[只能用类],所以其原理应该是
//类的名称反射查找
//太复杂,其实自己用的话可以写得简单点
static public void SetOnClick(View _view, String funcName, Activity _activity) {
//据说来自 View 类的源码
final String handlerName = funcName;
final View view = _view; //必须用一个 final 参数送到后面的匿名函数中去才行,普通变量是不行的
final Activity activity = _activity;
//view.getContext().getClass().getMethod("");
//view.setOnClickListener(new OnClickListener() {
//view.setOnClickListener(new Button.OnClickListener() {
view.setOnClickListener(new View.OnClickListener() {
private Method mHandler;
public void onClick(View v) {
try {
//mHandler = view.getContext().getClass().getMethod(handlerName, View.class);
////mHandler = activity.getClass().getMethod(handlerName, View.class);
mHandler = activity.getClass().getMethod(handlerName);
//这个是根据方法名称,以及方法参数的类型来获取指定的方法//用错了是不行的,要根据函数原来的参数列表来取
} catch (NoSuchMethodException e) //没找到这个名称的函数的话
{
Functions.ShowMessage(handlerName + "函数不存在(注意参数类型).", activity);
return;
//还是不要抛出异常的好,在某些模拟器上会直接崩溃
// throw new IllegalStateException("Could not find a method " +
// handlerName + "(View) in the activity "
// + activity.getClass() + " for onClick handler"
// + " on view " + activity.getClass().getName(), e);
}//
try {
//mHandler.invoke(getContext(), View.this);
////mHandler.invoke(view.getContext(), view);
mHandler.invoke(activity); //invoke 的参数也必须对得上,并且要多传递一个 this
} catch (IllegalAccessException e) {
Functions.ShowMessage(handlerName + "函数执行异常(注意参数类型).", activity);
return;
//还是不要抛出异常的好,在某些模拟器上会直接崩溃
// throw new IllegalStateException("Could not execute non "
// + "public method of the activity", e);
} catch (InvocationTargetException e) {
Functions.ShowMessage(handlerName + "函数执行异常(注意参数类型).", activity);
return;
// throw new IllegalStateException("Could not execute "
// + "method of the activity", e);
} catch (Exception e) {
Functions.ShowMessage(handlerName + "函数执行异常(注意参数类型)." + e.getMessage(), activity);
return;
}
//try
}//public
});//setOnClickListener
}//func
//设置一个按钮[其实是 view]的 onClick 事件,来自据说是 xml 设计器的源码,因为java不能直接将函数作为参数传递[只能用类],所以其原理应该是
//类的名称反射查找
//太复杂,其实自己用的话可以写得简单点
static public void SetOnClick(View _view, String funcName, Object _activity)
{
//据说来自 View 类的源码
final String handlerName = funcName;
final View view = _view; //必须用一个 final 参数送到后面的匿名函数中去才行,普通变量是不行的
final Object obj = _activity;
view.setOnClickListener(
new View.OnClickListener()
{
private Method mHandler;
public void onClick(View v) {
try {
//mHandler = view.getContext().getClass().getMethod(handlerName, View.class);
////mHandler = activity.getClass().getMethod(handlerName, View.class);
mHandler = obj.getClass().getMethod(handlerName);
//这个是根据方法名称,以及方法参数的类型来获取指定的方法//用错了是不行的,要根据函数原来的参数列表来取
} catch (NoSuchMethodException e) //没找到这个名称的函数的话
{
Functions.ShowMessage(handlerName + "函数不存在(注意参数类型).");
}//
try {
//mHandler.invoke(getContext(), View.this);
////mHandler.invoke(view.getContext(), view);
mHandler.invoke(obj); //invoke 的参数也必须对得上,并且要多传递一个 this
} catch (IllegalAccessException e) {
Functions.ShowMessage(handlerName + "函数执行异常(注意参数类型).");
} catch (InvocationTargetException e) {
Functions.ShowMessage(handlerName + "函数执行异常(注意参数类型).");
} catch (Exception e) {
Functions.ShowMessage(handlerName + "函数执行异常(注意参数类型)." + e.getMessage());
return;
}
//try
}//public
});//setOnClickListener
}//func
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.