登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 - [函数库] >> 主题: [android/Functions.java]Functions.SetOnClick 设置一个按钮[其实是 view]的 onClick 事件     [回主站]     [分站链接]
标题
[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





总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录
Functions.java 更多



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1