精华内容
下载资源
问答
  • setonclicklistener
    2022-05-31 23:20:51
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            binding = ActivitySplashBinding.inflate(getLayoutInflater());
    //        setContentView(R.layout.activity_splash);
            setContentView(binding.getRoot());
    
            final Button btn = binding.btnTest1;
            Log.i(TAG, "onCreate: binding btn");
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d(TAG, "onClick: " + v.getId());
                }
            });
            btn.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    Log.i(TAG, "onTouch: " + event.toString());
                    return false;
                }
            });
        }

    创建的是Empty Activity,默认setContentView(R.layout.activity_splash);改为
    setContentView(binding.getRoot());即可

    更多相关内容
  • Android onClick 与 setOnClickListener区别 为Android Widgets添加点击事件处理函数又两种方法,一个是在Xml文件中添加onClick属性,然后在代码中添加对应的函数。另一个是直接在代码中添加setOnClickListener函数...
  • http://blog.csdn.net/zhufuing/article/details/27807813 博文演示demo Android setOnClickListener报空指针异常错误demo
  • 3.设置setOnClickListener的注解 下面是使用 4. 其实retrofit也是这样做的,不过它不需要区分什么运行时注解和编译时注解,它是直接通过动态代理去创建一个我们传入的class,然后利用java写好的方法反射执行,当然...

    运行时注解

    @Retention(RetentionPolicy.RUNTIME) //runtime表示是运行时注解
    @Target(ElementType.FIELD)//表示作用与变量
    public @interface FindView11 {//注解的写法@interface  此时就可以使用@FindView11 作用与某个变量
        int value();
    }
    

    简单实现一下用注解去代替findViewById()

    1. ViewUtils

    这里是解析注解和反射注入的工具类

    尝试对activity或者view解析

    public static void inject(Activity activity) {
        inject(new ViewFinder(activity), activity);
    }
    
    public static void inject(View view) {
        inject(new ViewFinder(view), view);
    }
    
    private static void inject(ViewFinder finder, Object o) {
            injectField(finder, o);//解析并注入变量
          
        }
    
    
    // findViewById执行的地方
    public class ViewFinder {
    
        private View view;
        private Activity activity;
    
    
        public ViewFinder(View view) {
            this.view = view;
        }
    
        public ViewFinder(Activity activity) {
            this.activity = activity;
        }
    
    
        public View findViewById(int id) {
            return activity == null ? view.findViewById(id) : activity.findViewById(id);
        }
    
    
    
        public View findViewById(int id, int pid) {
            View pView = null;
            if (pid > 0) {
                pView = this.findViewById(pid);
            }
    
            View view = null;
            if (pView != null) {
                view = pView.findViewById(id);
            } else {
                view = this.findViewById(id);
            }
            return view;
        }
    
    
    }
    

    2. 解析注入变量

    private static void injectEvent(ViewFinder finder, Object o) {
        //通过Object拿到class
        Class<?> aClass = o.getClass();
        //获取所有变量
        Field[] fields = aClass.getDeclaredFields();
        
        //循环遍历带有特定注解的变量
        for (Field field : fields) {
            //这是我们自定义的注解
                FindView11 annotation = field.getAnnotation(FindView11.class);
                if (annotation != null) {
                    //注解中的value应该是R.id.xxxx
                    int viewId = annotation.value();
                    //交给finder去findViewById找到对应View
                    View view = finder.findViewById(viewId);
    
                    if (view != null) {
                        //设置所有变量可达
                        field.setAccessible(true);
                        try {
                            //给变量设定值
                            field.set(o, view);
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
    }
    //以上完成后就可以使用注解来findViewById了
    

    具体使用如下

    @FindView11(R.id.ttt)
        TextView view1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main3);
    
    //        view.setText("sdsd");
            ViewUtils.inject(this);
            view1.setText("sssssss");//这里就不会报空指针了
        }
    

    3.设置setOnClickListener的注解

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)//表示作用与方法
    public @interface OnClick {
        int[] value();//可以接收多个viewId
    }
    
    private static void injectEvent(ViewFinder finder, Object o) {
        Class<?> aClass = o.getClass();
        //获取所有方法
        Method[] declaredMethods = aClass.getDeclaredMethods();
        for (Method method : declaredMethods) {
            //找到包含该注解的方法
            OnClick onClick = method.getAnnotation(OnClick.class);
            if (onClick != null) {
                //拿到所有包含的viewId
                int[] views = onClick.value();
                if (views.length > 0) {
                    for (int viewId : views) {
                        View view = finder.findViewById(viewId);
                        if (view != null){
                            //这里可以直接监听然后反射执行
                           /**view.setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        method.setAccessible(true);
                                        try {
                                            method.invoke(o);
                                        } catch (IllegalAccessException e) {
                                            e.printStackTrace();
                                        } catch (InvocationTargetException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                });*/
                            
                            //也可以创建自己的监听然后反射执行
                            view.setOnClickListener(new onDeclaredClick(method,o));
                        }
                    }
                }
            }
        }
    
    }
    
    private static class onDeclaredClick implements View.OnClickListener{
        private Method method;
        private Object o;
    
        public onDeclaredClick(Method method, Object o) {
            this.method = method;
            this.o = o;
        }
    
        @Override
        public void onClick(View v) {
            try {
                method.setAccessible(true);
                method.invoke(o);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
    

    下面是使用

    @OnClick(R.id.ttt)
    private void click() {//如果click带有参数,则反射的invoke也需要传入参数,通常和原来的保持一直
        view1.setText("dddddd");
    }
    
    /**
    保持一直的做法
    @OnClick(R.id.ttt)
    private void click(View view) {
        view1.setText("dddddd");
    }
    
    view.setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        method.setAccessible(true);
                                        try {
                                            method.invoke(o,v);
                                        } catch (IllegalAccessException e) {
                                            e.printStackTrace();
                                        } catch (InvocationTargetException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                });*/
    

    4.

    其实retrofit也是这样做的,不过它不需要区分什么运行时注解和编译时注解,它是直接通过动态代理去创建一个我们传入的class,然后利用java写好的方法反射执行,当然,它做了很多处理了。

    取值描述作用范围使用场景
    RetentionPolicy.SOURCE表示注解只保留在源文件,当java文件编译成class文件,就会消失源文件只是做一些检查性的操作,,比如 @Override 和 @SuppressWarnings
    RetentionPolicy.CLASS注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期class文件(默认)要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife)
    RetentionPolicy.RUNTIME注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在运行时也存在需要在运行时去动态获取注解信息
    展开全文
  • btn_say_hello.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) { //使用匿名的Button实例 //抽象接口的内部方法的实现 } }) ; } } 4.如果不使用匿名实例,也可以定义一...

    1.使用接口继承按钮监听方法:

    public class Hello_to_worldActivity extends Activity implements Button.OnClickListener{

    private Button btn_say_hello;

    private TextView hello_world;

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    btn_say_hello = (Button)findViewById(R.id.bnt_SAY_HELLO_TO_WORLD);

    hello_world = (TextView)findViewById(R.id.textView1);

    btn_say_hello.setOnClickListener(this) ;//由于该类继承了BUTTON的监听,

    } //因此设置监听的参数只需传本类的对象即可

    public void onClick(View v) {

    // TODO Auto-generated method stub

    //抽象接口的内部方法的实现

    }

    2.使用接口继承view类的监听方法

    import android.view.View.OnClickListener;

    public class Hello_to_worldActivity extends Activity implements OnClickListener{

    private Button btn_say_hello;

    private TextView hello_world;

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    btn_say_hello = (Button)findViewById(R.id.bnt_SAY_HELLO_TO_WORLD);

    hello_world = (TextView)findViewById(R.id.textView1);

    btn_say_hello.setOnClickListener(this) ;//由于该类继承了view的监听,

    } //因此设置监听的参数只需传本类的对象即可

    public void onClick(View v) {

    //抽象接口的内部方法的实现

    } }

    3.不用接口,在类内部直接实现监听

    public class Hello_to_worldActivity extends Activity {

    private Button btn_say_hello;

    private TextView hello_world;

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    btn_say_hello = (Button)findViewById(R.id.bnt_SAY_HELLO_TO_WORLD);

    hello_world = (TextView)findViewById(R.id.textView1);

    btn_say_hello.setOnClickListener(new Button.OnClickListener(){

    public void onClick(View v) { //使用匿名的Button实例

    //抽象接口的内部方法的实现

    } }) ; } }

    4.如果不使用匿名实例,也可以定义一个具体的实例,如下

    public class Hello_to_worldActivity extends Activity {

    private Button btn_say_hello;

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    btn_say_hello = (Button)findViewById(R.id.bnt_SAY_HELLO_TO_WORLD);

    btn_listener bl = new btn_listener();

    btn_say_hello.setOnClickListener(bl); //bl是类btn_listener的实例,而btn_listener为监听方法的接口

    } //因此设置监听的参数只需传本类的对象即可

    }

    class btn_listener implements Button.OnClickListener

    {

    public void onClick(View v) {

    } }

    5.多个button如何识别

    button1.setOnClickListener(this);

    button1.setTag(B1); button2.setOnClickListener(this);

    button2.setTag(B2); button3.setOnClickListener(this);

    button3.setTag(B3);

    @Override

    public void onClick(View v) { int tag =

    (Integer) v.getTag(); switch (tag){

    case B1:

    //

    break;

    .......

    } }

    展开全文
  • btn_say_hello.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) { //使用匿名的Button实例 //抽象接口的内部方法的实现 } }) ; } } 4.如果不使用匿名实例,也可以定义一个具体的...

    1.使用接口继承按钮监听方法:

    public class Hello_to_worldActivity extends Activity implements Button.OnClickListener{

    private Button btn_say_hello;

    private TextView hello_world;

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    btn_say_hello = (Button)findViewById(R.id.bnt_SAY_HELLO_TO_WORLD);

    hello_world = (TextView)findViewById(R.id.textView1);

    btn_say_hello.setOnClickListener(this) ;//由于该类继承了BUTTON的监听,

    } //因此设置监听的参数只需传本类的对象即可

    public void onClick(View v) {

    // TODO Auto-generated method stub

    //抽象接口的内部方法的实现

    }

    2.使用接口继承view类的监听方法

    import android.view.View.OnClickListener;

    public class Hello_to_worldActivity extends Activity implements OnClickListener{

    private Button btn_say_hello;

    private TextView hello_world;

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    btn_say_hello = (Button)findViewById(R.id.bnt_SAY_HELLO_TO_WORLD);

    hello_world = (TextView)findViewById(R.id.textView1);

    btn_say_hello.setOnClickListener(this) ;//由于该类继承了view的监听,

    } //因此设置监听的参数只需传本类的对象即可

    public void onClick(View v) {

    //抽象接口的内部方法的实现

    } }

    3.不用接口,在类内部直接实现监听

    public class Hello_to_worldActivity extends Activity {

    private Button btn_say_hello;

    private TextView hello_world;

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    btn_say_hello = (Button)findViewById(R.id.bnt_SAY_HELLO_TO_WORLD);

    hello_world = (TextView)findViewById(R.id.textView1);

    btn_say_hello.setOnClickListener(new Button.OnClickListener(){

    public void onClick(View v) { //使用匿名的Button实例

    //抽象接口的内部方法的实现

    } }) ; } }

    4.如果不使用匿名实例,也可以定义一个具体的实例,如下

    public class Hello_to_worldActivity extends Activity {

    private Button btn_say_hello;

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    btn_say_hello = (Button)findViewById(R.id.bnt_SAY_HELLO_TO_WORLD);

    btn_listener bl = new btn_listener();

    btn_say_hello.setOnClickListener(bl); //bl是类btn_listener的实例,而btn_listener为监听方法的接口

    } //因此设置监听的参数只需传本类的对象即可

    }

    class btn_listener implements Button.OnClickListener

    {

    public void onClick(View v) {

    } }

    5.多个button如何识别

    button1.setOnClickListener(this);

    button1.setTag(B1);

    button2.setOnClickListener(this);

    button2.setTag(B2);

    button3.setOnClickListener(this);

    button3.setTag(B3);

    @Override

    public void onClick(View v) {

    int tag = (Integer) v.getTag();

    switch (tag){

    case B1:

    //

    break;

    .......

    }

    }

    展开全文
  • 浅谈setOnClickListener使用方法

    千次阅读 2020-12-14 14:56:19
    setOnClickListener是Android开发中常用的点击事件监听器,多用于页面按钮调用。它的实现方法比较特殊,是通过回调实现的。下面看看它的源码 /** * Register a callback to be invoked when this view is ...
  • loginButton.setOnClickListener(this);这里的this是什么意思? 我有点不理解为什么这里用一个this就调用了onClick这个方法呢? 一般来说,android中的接口回调有3中。 1、 主程序回调 默认的这种this,结果...
  • shop1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { all.setChecked(true); shop1.setChecked(true); } }...
  • listview.setonclicklistener

    2014-03-28 15:48:30
    listview.setonclicklistener
  • webview设置setOnClickListener是无效的: webView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); 可以设置setOnTouchListener: webView.set
  • 为啥B已经setOnClickListener(null),焦点还是被消耗了。 原因:A的OnTouchEvent不会被执行。 父View想要捕获事件处理,那么子View,也就是B的onTouchEvent应该返回false。 不卖关子,先给解决办法:如果B设置了...
  • 本人想知道1、setOnClickListener()方法的意思是设置监听器的意思吗?2、假如是的传入的参数是指要被监控的对象吗?3、上面的代码是给butTOW的监控事件,要监控的是butTow,传入的参数为什么不是butTow,而要用匿名...
  • Android studio 使用 setOnClickListener()方法时无法使用单个view以外的多个view添加 setOnClickListener()的方法。 出现场景: 平时是一个按钮绑定一个事件,现在有多个按钮,需要添加多个事件,不想像单个view...
  • siv_update.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); } } 不加 siv_update.setOnClickListener(new OnClickListener() { ...
  • 最近项目中要做一个音乐播放...按常规思路,先给整个悬浮窗setOnTouchListener,然后再给你里面的按钮setOnClickListener,点击运行,结果发现,点击事件是可以响应,拖拽也没问题,但是当手指放在ImageView上拖拽时,o
  • 在kotlin中,我们可以像这样使用setOnClickListener():view.setOnClickListener { println("Hello") }但是如果我定义自己的界面,我只能传递这样的匿名对象:obj.setMyListener(object: MyListener() {...})我只是想...
  • kotlin 仿照setOnclickListener写法 var listener :((Int) ->Unit)?=null fun setOnItemClickListener(listener:(Int) ->Unit){ this.listener = listener } if (listener!=null) listener!!(position...
  • 博客ListView中含有Button时setOnclickListener应写在Adapter的什么地方的代码http://blog.csdn.net/yangzl2008/article/details/7863938
  • void setOnClicklistener(OnClicklistener onClicklistener) { this.mOnClicklistener = onClicklistener; }; public int getId(){ return mID; }; } 2.模拟android控件继承View package com.test; /** * Created ...
  • Android Studio的Button控件的onClick属性、setOnClickListener函数与OnClickListener接口用法onClick属性setOnClickListener函数OnClickListener接口 添加点击事件处理函数有三种方法,一个是在Xml文件中添加...
  • 说说 setOnClickListener 的几种方式 与 向上向下转型

    万次阅读 多人点赞 2019-01-06 13:46:34
    说说 setOnClickListener 因为不是计算机专业,当时入门安卓的时候,看的 Mars 的视频学起来的,挺多知识很迷糊。 后面也是开始做了些项目才慢慢熟悉起来。 最近花了一些时间,把做的第一个 app 重构了下...
  • 单击按钮时是否可以将参数传递给侦听器:protected void onCreate(Bundle savedInstanceState) {....String myArg = "Hello";Button button1 = (Button)...button1.setOnClickListener(myListener);String myA...
  • 报错情况如下:tvHome是一个TextView对象,已经初始化了,但是调用tvHome.setOnClickListener(this) 会报错 Kotlin中解决办法:在HomeActivity中实现View.OnClickListener即可
  • 原代码,this变红protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn=findViewById(R.id.btn_...btn.setOnClickListener(this);}123...
  • 试图将onClickListener添加到我的listView中的项目,我收到一条错误声明:“类型View中的方法setOnClickListener(View.OnClickListener)不适用于参数(new DialogInterface.OnClickListener(){})”on这条线:holder....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 241,621
精华内容 96,648
关键字:

setonclicklistener