-
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方法对比
2021-01-05 03:30:33Android onClick 与 setOnClickListener区别 为Android Widgets添加点击事件处理函数又两种方法,一个是在Xml文件中添加onClick属性,然后在代码中添加对应的函数。另一个是直接在代码中添加setOnClickListener函数... -
Android setOnClickListener报空指针异常演示demo
2014-05-31 20:00:06http://blog.csdn.net/zhufuing/article/details/27807813 博文演示demo Android setOnClickListener报空指针异常错误demo -
运行时注解findViewById和setOnClickListener
2022-06-24 16:35:433.设置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文件之后,仍然存在 运行时也存在 需要在运行时去动态获取注解信息 -
Android学习之setOnClickListener
2021-06-08 15:30:34btn_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;
.......
} }
-
Android之setOnClickListener()
2021-05-27 01:39:52btn_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:19setOnClickListener是Android开发中常用的点击事件监听器,多用于页面按钮调用。它的实现方法比较特殊,是通过回调实现的。下面看看它的源码 /** * Register a callback to be invoked when this view is ... -
loginButton.setOnClickListener(this)
2021-09-27 22:36:06loginButton.setOnClickListener(this);这里的this是什么意思? 我有点不理解为什么这里用一个this就调用了onClick这个方法呢? 一般来说,android中的接口回调有3中。 1、 主程序回调 默认的这种this,结果... -
shop1.setOnClickListener(new View.OnClickListener()空指针异常
2020-03-18 21:53:34shop1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { all.setChecked(true); shop1.setChecked(true); } }... -
listview.setonclicklistener
2014-03-28 15:48:30listview.setonclicklistener -
Android WebView的setOnClickListener无效
2021-06-10 14:23:18webview设置setOnClickListener是无效的: webView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); 可以设置setOnTouchListener: webView.set -
setOnClickListener(null)父控件依然拿不到点击
2022-03-18 17:17:00为啥B已经setOnClickListener(null),焦点还是被消耗了。 原因:A的OnTouchEvent不会被执行。 父View想要捕获事件处理,那么子View,也就是B的onTouchEvent应该返回false。 不卖关子,先给解决办法:如果B设置了... -
Android 的 setOnClickListener(参数)求大哥指导
2021-06-02 15:19:41本人想知道1、setOnClickListener()方法的意思是设置监听器的意思吗?2、假如是的传入的参数是指要被监控的对象吗?3、上面的代码是给butTOW的监控事件,要监控的是butTow,传入的参数为什么不是butTow,而要用匿名... -
解决Android Studio 中多个 View 的 setOnClickListener 添加方法(不能用this)
2021-10-18 15:14:19Android studio 使用 setOnClickListener()方法时无法使用单个view以外的多个view添加 setOnClickListener()的方法。 出现场景: 平时是一个按钮绑定一个事件,现在有多个按钮,需要添加多个事件,不想像单个view... -
调用setOnClickListener会导致程序崩溃。
2018-11-23 09:35:48siv_update.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); } } 不加 siv_update.setOnClickListener(new OnClickListener() { ... -
Android事件冲突解决--悬浮窗拖拽问题,setOnTouchListener和setOnClickListener冲突
2021-08-24 20:35:51最近项目中要做一个音乐播放...按常规思路,先给整个悬浮窗setOnTouchListener,然后再给你里面的按钮setOnClickListener,点击运行,结果发现,点击事件是可以响应,拖拽也没问题,但是当手指放在ImageView上拖拽时,o -
android – kotlin如何使setOnClickListener接受函数作为参数
2021-06-02 15:18:45在kotlin中,我们可以像这样使用setOnClickListener():view.setOnClickListener { println("Hello") }但是如果我定义自己的界面,我只能传递这样的匿名对象:obj.setMyListener(object: MyListener() {...})我只是想... -
kotlin 仿照setOnclickListener写法
2021-02-02 15:41:33kotlin 仿照setOnclickListener写法 var listener :((Int) ->Unit)?=null fun setOnItemClickListener(listener:(Int) ->Unit){ this.listener = listener } if (listener!=null) listener!!(position... -
ListView中含有Button时setOnclickListener应写在Adapter的什么地方
2012-08-17 19:10:49博客ListView中含有Button时setOnclickListener应写在Adapter的什么地方的代码http://blog.csdn.net/yangzl2008/article/details/7863938 -
android setOnClickListener 回调函数理解
2021-05-27 02:01:38void setOnClicklistener(OnClicklistener onClicklistener) { this.mOnClicklistener = onClicklistener; }; public int getId(){ return mID; }; } 2.模拟android控件继承View package com.test; /** * Created ... -
Android Studio的Button控件的onClick属性、setOnClickListener函数与OnClickListener接口用法
2021-10-25 10:27:26Android Studio的Button控件的onClick属性、setOnClickListener函数与OnClickListener接口用法onClick属性setOnClickListener函数OnClickListener接口 添加点击事件处理函数有三种方法,一个是在Xml文件中添加... -
说说 setOnClickListener 的几种方式 与 向上向下转型
2019-01-06 13:46:34说说 setOnClickListener 因为不是计算机专业,当时入门安卓的时候,看的 Mars 的视频学起来的,挺多知识很迷糊。 后面也是开始做了些项目才慢慢熟悉起来。 最近花了一些时间,把做的第一个 app 重构了下... -
java – 调用setOnClickListener时传递参数?
2021-03-03 12:47:38单击按钮时是否可以将参数传递给侦听器:protected void onCreate(Bundle savedInstanceState) {....String myArg = "Hello";Button button1 = (Button)...button1.setOnClickListener(myListener);String myA... -
Android学习之setOnClickListener(this)报错(kotlin)
2021-07-30 15:15:59报错情况如下:tvHome是一个TextView对象,已经初始化了,但是调用tvHome.setOnClickListener(this) 会报错 Kotlin中解决办法:在HomeActivity中实现View.OnClickListener即可 -
Android Studio中setOnClickListener不能使用this的解决方法
2021-06-06 02:09:07原代码,this变红protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn=findViewById(R.id.btn_...btn.setOnClickListener(this);}123... -
java – 类型View中的方法setOnClickListener(View...
2021-02-28 10:46:37试图将onClickListener添加到我的listView中的项目,我收到一条错误声明:“类型View中的方法setOnClickListener(View.OnClickListener)不适用于参数(new DialogInterface.OnClickListener(){})”on这条线:holder....