android onclick事件(android 点击事件 为什么不起作用)
本文目录
- android 点击事件 为什么不起作用
- Android源码追踪—android:onClick
- android onclick是怎样实现的
- Android Fragment的布局中使用android:onClick 属性时需要注意的问题
- Android按钮onclick事件是不是只能重写一次我每个按钮都重写一次好像立马死机,不可以吗新手勿喷谢谢
- android onclick事件和ontouch事件是否会冲突
- android中如何利用onclick事件启动线程
android 点击事件 为什么不起作用
Android中View的点击事件如果没有触发,那肯定是代码写的有问题,onClick事件有四种写法:1.匿名内部类: button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //点击后执行 }});2.自定义单击事件监听类: class MyClickListener implements OnClickListener { @Override public void onClick(View v) { //点击后执行 }}3.Activity直接实现View.OnClickListener的onClick方法 @Override public void onClick(View v) { //点击后执行}4.在XML文件中显示指定按钮的onClick属性,这样点击按钮时会利用反射的方式调用对应Activity中的click()方法:android:onClick="onClick"public void onClick(View v) { //点击后执行}
Android源码追踪—android:onClick
之前对源码的阅读,总是用时一通乱七八糟的跳转,以学会使用为目的;过了一段时间,就忘记了,因此打算将一些源码的阅读经历记录下来,也通过敲一遍的过程,加深理解。
最开始,用一个比较简单的例子来小试牛刀吧
对于View(Button、TextView等)的点击事件,常用的写法是通过 findViewById 获取View的实例,然后通过 setOnClickListener 设置监听事件,比如我们有如下Button控件。
设置点击事件(假设在Activity中)
但是还有一种写法是在xml布局中通过android:onClick属性直接指定点击执行的函数。
【思考】
首先我们知道诸如 android:xxx 之类的属性是会在某个attrs文件中定义的,此处的 android:onClick 是View的属性,定义在如下文件中。
在View的构造函数中,会解析出此属性的值。
看这里, 如果变量handlerName不为空,就会为此View设置点击事件了 ,这个handlerName就是onClick属性的值doSubmit,但这个点击事件,并不是我们所熟悉的OnClickListener。
进一步看看这个 DeclaredOnClickListener 类
DeclaredOnClickListener 实现了 OnClickListener ,其中重点是参数 mResolvedMethod 和 mResolvedContext 。
在onClick事件中最终通过反射 mResolvedMethod.invoke(mResolvedContext, v); 执行了doSubmit方法。
doSubmit的访问权限是否可以设置为private呢?
答案:不可以,因为源码中没有调用 mMethod.setAccessible(true); 注入所有修饰符。
其实在onClick属性的注释中就已经说明了。
android onclick是怎样实现的
Button button = (Button)findViewById(R.id.button1);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {TextView textview = (TextView)findViewById(R.id.textView1);textview.setText("Button");}});这种方式用findviewbyid通过id实例化出来这个button,然后通过设置button的listener监听对象,并同时实现接口OnClickListenter的OnClick()方法。这种方式的代码量不多,但是在java中,面向对象的思想,关于耦合,模块化它达不到。代码堆叠在一起,比较臃肿。
Android Fragment的布局中使用android:onClick 属性时需要注意的问题
下面是一个在fragment的布局中定义的一个点击事件 按照常规操作,我们需要在宿主中定义一个名为 onMessageViewClick 的public 方法 这样看起来没什么问题,但是跑起来直接报错: 在持有fragment的activity中定义改方法即可 1.报错信息:无法在对应的context中找到名为 onMessageViewClick 的方法(其实这里已经说的很明白了,找不到方法,在view的context中) 那看一下当我们点击view的时候系统是怎么寻找对应的方法的: 直接上截图,下面是view类中的一个内部类 看一下属性就明白这个类似干什么的了(膜拜) mHostView:定义了onClick属性的view mMethodName:方法名称 mResolvedContext:反射对象 mResolvedMethod:反射方法 所以view是通过反射的方式来调用方法的(大家应该不看源码都知道的),这里的mResolvedContext 是通过View.getContext获取的 那么,view的context中为什么找不到方法呀,我都定义了不是吗。但是,注意一下,我们定义的方法是在Fragment中,fragment,fragment是context吗?当然不是,看看fragment class的定义
Android按钮onclick事件是不是只能重写一次我每个按钮都重写一次好像立马死机,不可以吗新手勿喷谢谢
不是只能重写一次的,因为你的setcontentview不在oncreate里面,你学过生命周期吧,你在自定义的方法里,这样是无法刷新布局的,这样写是不对的另外死机是啥回事,写代码还会死机?你要实现按下按钮切换布局的话,要在oncreate里面写才可以
android onclick事件和ontouch事件是否会冲突
Button的onTouch,onClick,onLongClick事件发生先后顺序和关联:一,onTouch返回false首先是onTouch事件的down事件发生,此时,如果长按,触发onLongClick事件;然后是onTouch事件的up事件发生,up完毕,最后触发onClick事件。二,onTouch返回true首先是onTouch事件的down事件发生,然后是onTouch事件的up事件发生;期间不触发onClick和onLongClick事件三,onTouch:down返回true,up返回false:结果同二。机制分析: onTouch事件中:down事件返回值标记此次事件是否为点击事件(返回false,是点击事件;返回true,不记为点击事件),而up事件标记此次事件结束时间,也就是判断是否为长按。只要当down返回true时候,系统将不把本次事件记录为点击事件,也就不会触发onClick或者onLongClick事件了。因此尽管当up的时候返回false,系统也不会继续触发onClick事件了。四,onTouch:down返回false,up返回true:首先是onTouch事件的down事件发生,此时:长按,触发onLongClick事件,然后是onTouch事件的up事件发生,完毕。短按,先触发onTouch的up事件, 到一定时间后,自动触发onLongClick事件。机制分析: onTouch事件中:down事件返回值标记此次事件是否为点击事件(返回false,是点击事件;返回true,不记为点击事件),而up事件标记此次事件结束时间,也就是判断是否为长按。 当down返回false,标记此次事件为点击事件,而up返回了true,则表示此次事件一直没有结束,也就是一直长按下去了,达到长按临界时间后,自然触发长按事件,而onClick事件没有触发到
android中如何利用onclick事件启动线程
View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View view) { new Thread(new Runnable() { @Override public void run() { } }).start(); }};
更多文章:
excel中index函数的用法(Excel中INDEX函数怎么使用)
2024年6月24日 10:25
router是什么意思(vue的$route和$router有什么区别和关系呢)
2024年6月27日 17:14
jdbc的作用(在java中JDBC的主要作用是什么和他的组成有哪些)
2024年7月4日 06:29
android系统签名怎么查看(Android怎样获取应用的签名信息)
2024年5月26日 13:05
script hook rdr2(请问谁知道哪里有远程控制软件VNC的源码)
2024年7月16日 06:04
正则匹配两个汉字(正则表达式在一段文本中匹配到包含的两个汉字的某一行)
2024年7月7日 18:50
php判断数据库是否连接成功(php pdo连接mysql如何判断数据库是否连接成功)
2024年7月8日 13:31
cluster的同义词(有人能不能告诉我 crowd , cluster和throng 这三个单词的区别啊)
2024年7月29日 15:10
php学校新闻管理系统代码(用php制作新闻页面的后台管理系统怎么设计.急用!!!)
2024年8月23日 16:50