安卓按钮单击事件
Android的Button按钮,ACTION_UP事件不触发解决方案

Android的Button按钮,ACTION_UP事件不触发解决⽅案在android 编程时,有时候要实现当Button⼀直按下的时候,执⾏⼀些逻辑代码,当按钮弹起的时候,终⽌这些逻辑代码的执⾏。
⽐如在设置页⾯的滑动开关时,如果不监听ACTION_CANCEL,在滑动到中间时,如果你⼿指上下移动,就是移动到开关控件之外,就会造成开关的按钮停顿在中间位置。
在⼀般情况下,实现这个逻辑需要注册OnTouchListener监听,OnTouchListener的OnTouch⽅法中代码如下:switch (event.getAction()) {case MotionEvent.ACTION_DOWN://按钮按下逻辑break;case MotionEvent.ACTION_UP://按钮弹起逻辑break;}在⼀般情况下,这样写是没有问题的,但是当⼿指快速滑过这个Button时,就会发现只触发了ACTION_DOWN时间,没有触发ACTION_UP,就会导致,按钮按下的逻辑代码⼀直会执⾏。
当焦点移动到件之外,此时会触发ACTION_CANCEL,⽽不是ACTION_UP,造成按下的逻辑⼀直会执⾏。
为了解决这个问题,上述代码可以需要修改为:switch (event.getAction()) {case MotionEvent.ACTION_DOWN://按钮按下逻辑break;case MotionEvent.ACTION_UP://按钮弹起逻辑break;case MotionEvent.ACTION_CANCEL://按钮弹起逻辑break;}ACTION_UP处理的是在Button原位置弹起,ACTION_CANCEL处理的是焦点离开Button,两者都需要处理,才能解决这个问题。
⽰例(我这个是在按下的时候,让按钮放⼤,⼿抬起的时候缩⼩操作):login_with_sina.setOnTouchListener(new OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:System.out.println("++++++key_down");AnimUtil.showOnFocusAnimation(login_with_sina);break;case MotionEvent.ACTION_UP:System.out.println("++++++key_down");AnimUtil.showLooseFocusAinimation(login_with_sina);break;case MotionEvent.ACTION_CANCEL:System.out.println("++++++key_down");AnimUtil.showLooseFocusAinimation(login_with_sina);break;}return true;}});。
Android adb模拟滑动+按键+点击事件

adb shell input keyevent 29 # for key 'A'
adb shell input keyevent 54 # for key 'B'
adb shell input text "ANDROID"
KEYCODE_BUTTON_5 通用游戏手柄按钮 #5
KEYCODE_BUTTON_6 通用游戏手柄按钮 #6
KEYCOUTTON_8 通用游戏手柄按钮 #8
KEYCODE_BUTTON_9 通用游戏手柄按钮 #9
KEYCODE_NUMPAD_6 小键盘按键'6'
KEYCODE_NUMPAD_7 小键盘按键'7'
KEYCODE_NUMPAD_8 小键盘按键'8'
KEYCODE_NUMPAD_9 小键盘按键'9'
KEYCODE_NUMPAD_ADD 小键盘按键'+'
KEYCODE_NUMPAD_SUBTRACT 小键盘按键'-'
KEYCODE_NUMPAD_MULTIPLY 小键盘按键'*'
KEYCODE_NUMPAD_DIVIDE 小键盘按键'/'
KEYCODE_NUMPAD_EQUALS 小键盘按键'='
KEYCODE_NUMPAD_COMMA 小键盘按键','
KEYCODE_NUMPAD_DOT 小键盘按键'.'
按钮的四种点击事件

按钮的四种点击事件第一种(适用1-2个按钮的)public class MainActivity extends AppCompatActivity {private static EditText editText;private static Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);editText = (EditText) findViewById(R.id.edit_text);button = (Button) findViewById(R.id.btn);button.setOnClickListener(new 方法名test());}private class test implements View.OnClickListener {@Overridepublic void onClick(View v) {//点击后的操作}}}第二种(适用1-2个按钮的)public class MainActivity extends AppCompatActivity {private static EditText editText;private static Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);editText = (EditText) findViewById(R.id.edit_text);button = (Button) findViewById(R.id.btn);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//点击后的操作}});}}第三种(适用于很多按钮)public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private static EditText editText;private static Button button;@Overrideprotected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(yout.activity_main);editText = (EditText) findViewById(R.id.edit_text);button = (Button) findViewById(R.id.btn);button.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.btn://点击后的操作;break;case //按钮的ID://点击后的操作;break;case //按钮的ID://点击后的操作;break;case //按钮的ID://点击后的操作;break;......}}}第四种方式(适用于自己写的Demo)在xml文件中设置按钮的这种属性Android:onClick= "方法名"在相对于的Action种创建public void 方法名(View v){//点击后的操作}。
android 事件传递原理

android 事件传递原理Android是当前最流行的移动操作系统,它的事件传递机制是安卓开发中必须了解的一个问题。
本文将带您从简单到复杂的三个方面,逐步解析安卓事件传递的原理。
一、事件类型首先,我们需要知道Android事件的三大类型:1. 触摸事件:通过手指在屏幕上进行滑动、点击等手势操作触发。
2. 按键事件:用户在设备上的按键输入,如键盘、物理键等。
3. 轨迹球事件:主要针对轨迹球设备,但是由于这种设备很少被使用,所以这里不再深入讲解。
二、事件传递流程在了解了事件类型后,我们可以探讨一下事件传递的具体流程。
每一个事件都是通过ViewGroup或者View的dispatchTouchEvent()方法进行传递的。
我们可以将事件的传递过程抽象为TouchTarget链表。
当一个事件发生后,它会从Activity开始一层层向下传递,当找到能够处理该事件的View或ViewGroup时,则会调用其onTouchEvent()方法完成相应操作。
如果从顶层的ViewGroup开始寻找,当它的dispatchTouchEvent()方法返回true时,则整个事件处理结束。
如果返回false,则事件继续向下传递给下一个ViewGroup或View,直到找到可以处理这个事件的View为止。
由此可见,对于同一个事件,ViewGroup和父子View的处理有时是相互影响的,需要通过继承ViewGroup或者View,重写dispatchTouchEvent()和onTouchEvent()方法来控制事件传递的方式。
三、事件分发机制实际上,在ViewGroup中,事件传递机制涉及到的方法有三个:1. dispatchTouchEvent():负责分发事件。
2. onInterceptTouchEvent():拦截事件,阻止向下分发。
3. onTouchEvent():接收分发下来的事件。
其中,事件分发有三个阶段:1. 捕获阶段:事件从Activity传递到最外层的ViewGroup。
ooalv自定义按钮、单击、双击、列编辑切换的事件

84.gs_toolbar-function ='B_LIST'."为按钮分配功能码
85.gs_toolbar-quickinfo = '自定义下拉菜单'.
86.gs_toolbar-icon=icon_biw_report_view."为按钮分配图标
87.gs_toolbar-text='下拉菜单'."为按钮分配文本
35.CLASS alv_event_receiver DEFINITION DEFERRED. "声明类对象
36.*----------------------------------------------------------------------*
37.*CLASS alv_event_receiver DEFINITION
127.MESSAGE '请至少选择一行数据区打印!' TYPE 'E'. "E类型消息会转化为A类型,很蛋疼,求破!
128.ELSE.
129.PERFORM frm_print_data."这个没具体写。
130.ENDIF.
131.WHEN 'B_EDIT'.
132.IF grid->is_ready_for_input( ) EQ 0.
66.*&---------------------------------------------------------------------*
67.*Text
68.*----------------------------------------------------------------------*
Android 事件处理机制

Android 事件处理机制Android 作为一款主流的移动操作系统,拥有强大的事件处理机制,使得开发者可以方便地对用户的操作进行响应和处理。
本文将介绍Android的事件处理机制及其相关的内容。
一、概述Android事件处理机制主要用于检测和响应用户在界面上的各种操作,包括点击、滑动、长按等。
通过灵活运用Android事件处理机制,开发者可以实现丰富多样的用户交互效果,提升应用的用户体验。
二、事件传递1. 事件传递的核心概念- 事件传递分为三个阶段:事件分发、事件拦截、事件处理。
- 事件的传递是从上至下的过程,即从Activity到ViewGroup,再到最终的View。
2. 事件分发- 事件首先会被分发给当前界面的顶层View的dispatchTouchEvent()方法进行处理。
- 顶层View会根据具体的触摸事件类型(DOWN、MOVE、UP、CANCEL)进行相应的处理。
3. 事件拦截- 如果顶层View在处理事件后,认为自己不能完全处理该事件,则会将事件交给子View处理,通过调用子View的dispatchTouchEvent()方法传递事件给子View。
- 子View可以通过重写onInterceptTouchEvent()方法来决定是否拦截事件。
4. 事件处理- 最终,事件会传递到具体的View上,并通过重写onTouchEvent()方法来实现事件的处理。
- View可以根据具体的事件类型(点击、滑动、长按等)执行相应的操作。
三、事件分发机制1. 事件分发的层级关系- Android中的事件分发机制是基于层级关系的,即不同的ViewGroup和View之间存在不同的事件分发机制。
- ViewGroup和View都重写了dispatchTouchEvent()方法,用于对事件进行分发。
2. ViewGroup中的事件分发- ViewGroup会根据具体的事件类型,将事件传递给自己的子View。
按钮单击事件的四种方法

按钮单击事件的四种方法在编写网页时,按钮是非常常用的元素之一。
按钮的主要作用是触发事件,其中最常见的事件是点击事件。
下面是四种实现按钮单击事件的方法:1. 使用HTML的onclick属性:在按钮元素中使用onclick属性,将JavaScript函数作为属性值传递给它。
例如:```<button onclick="myFunction()">点击我</button>```在这个例子中,当用户单击按钮时,将调用名为myFunction的JavaScript函数。
2. 使用JavaScript的addEventListener方法:使用addEventListener方法,您可以为按钮添加单击事件侦听器。
例如:```<button id="myBtn">点击我</button>```document.getElementById("myBtn").addEventListener("click", myFunction);```在这个例子中,当用户单击id为“myBtn”的按钮时,将调用名为myFunction的JavaScript函数。
3. 使用jQuery:使用jQuery库,您可以轻松地为按钮添加单击事件。
例如:```<button id="myBtn">点击我</button>``````$("#myBtn").click(function() {myFunction();```在这个例子中,当用户单击id为“myBtn”的按钮时,将调用名为myFunction的JavaScript函数。
4. 使用Vue.js:使用Vue.js库,您可以使用v-on指令添加单击事件。
例如:```<button v-on:click="myFunction">点击我</button>```在这个例子中,当用户单击按钮时,将调用名为myFunction的Vue.js方法。
Android按键事件处理流程 -- KeyEvent

Android按键事件处理流程 -- KeyEvent2014/6/24 13:18:58 xiaoweiz 程序员俱乐部我要评论(0)•••刚接触Android开发的时候,对touch、key事件的处理总是一知半解,一会是Activity里的方法,一会是各种View中的,自己始终不清楚到底哪个在先哪个在后,总之对整个处理流程没能很好的把握。
每次写这部分代码的时候都有些心虚,因为我不是很清楚什么时候、以什么样的顺序被调用,大都是打下log看看,没问题就算ok了。
但随着时间流逝,这种感觉一直折磨着我。
期间也在网上搜索了相关资料,但总感觉不是那么令人满意。
自打开始研究Android源码起,这部分内容的分析早就被列在我的TODO list上了。
因为弄懂这部分处理逻辑对明明白白地写android程序实在是太重要了,所以今天我就带领大家看看这部分的处理逻辑。
touch事件的处理我将放在另一篇博客中介绍(相比KeyEvent,大体都一样,只是稍微复杂些)。
为了突出本文的重点,我们直接从事件被派发到View层次结构的根节点DecorView 开始分析,这里我们先来看看DecorView#dispatchKeyEvent方法,代码如下:@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {final int keyCode = event.getKeyCode();final int action = event.getAction();final boolean isDown = action == KeyEvent.ACTION_DOWN;/// 1. 第一次down事件的时候,处理panel的快捷键if (isDown && (event.getRepeatCount() == 0)) {// First handle chording of panel key: if a panel key is held // but not released, try to execute a shortcut in it.if ((mPanelChordingKey > 0) && (mPanelChordingKey != keyCode)) {boolean handled = dispatchKeyShortcutEvent(event);if (handled) {return true;}}// If a panel is open, perform a shortcut on it without the // chorded panel keyif ((mPreparedPanel != null) && mPreparedPanel.isOpen) { if (performPanelShortcut(mPreparedPanel, keyCode, event, 0)) {return true;}}}/// 2. 这里是我们本文的重点,当window没destroy且其Callback 非空的话,交给其Callback处理if (!isDestroyed()) { // Activity、Dialog都是Callback接口的实现final Callback cb = getCallback(); // mFeatureId < 0 表示是application的DecorView,比如Activity、Dialogfinal boolean handled = cb != null && mFeatureId < 0 ? cb.dispatchKeyEvent(event) // 派发给callback的方法: super.dispatchKeyEvent(event); // 否则直接派发到ViewGroup#dispatchKeyEvent(View层次结构)if (handled) {return true; // 如果被上面的步骤处理了则直接返回true,不再往下传递}}/// 3. 这是key事件的最后一步,如果到这一步还没处理掉,则派发到PhoneWindow对应的onKeyDown, onKeyUp方法return isDown ? PhoneWindow.this.onKeyDown(mFeatureId, event.getKeyCode(), event): PhoneWindow.this.onKeyUp(mFeatureId,event.getKeyCode(), event);}接下来我们按照这个派发顺序依次来看看相关方法的实现,这里先看看Activity(Callback)的dispatchKeyEvent实现:/*** Called to process key events. You can override this to intercept all* key events before they are dispatched to the window. Be sure to call* this implementation for key events that should be handled normally. ** @param event The key event.** @return boolean Return true if this event was consumed.*/@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {/// 2.1. 回调接口,实际开发中用处不大,你感兴趣可以参看其方法doc onUserInteraction();Window win = getWindow();/// 2.2. 从这里事件的处理交给了与之相关的window对象,实质是派发到了view层次结构if (win.superDispatchKeyEvent(event)) {return true;}View decor = mDecor;if (decor == null) decor = win.getDecorView();/// 2.3. 到这里如果view层次结构没处理则交给KeyEvent本身的dispatch方法,Activity的各种回调方法会被触发return event.dispatch(this, decor != nulldecor.getKeyDispatcherState() : null, this);}紧接着我们看看,Window#superDispatchKeyEvent方法,相关代码如下:<!-- Window.java -->/*** Used by custom windows, such as Dialog, to pass the key press event * further down the view hierarchy. Application developers should * not need to implement or call this.**/public abstract boolean superDispatchKeyEvent(KeyEvent event);<!-- PhoneWindow.java -->@Overridepublic boolean superDispatchKeyEvent(KeyEvent event) {return mDecor.superDispatchKeyEvent(event);}<!-- DecorView.superDispatchKeyEvent -->public boolean superDispatchKeyEvent(KeyEvent event) {/// 2.2.1. 进入view层次结构了,即调用ViewGroup的对应实现了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一种:匿名内部类作为事件监听器类
大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适,实际上,这种形式是目前是最广泛的事件监听器形式。
上面的程序代码就是匿名内部类来创建事件监听器的!!!
对于使用匿名内部类作为监听器的形式来说,唯一的缺点就是匿名内部类的语法有点不易掌握,如果读者java基础扎实,匿名内部类的语法掌握较好,通常建议使用匿名内部类作为监听器。
第二种:内部类作为监听器
将事件监听器类定义成当前类的内部类。
1、使用内部类可以在当前类中复用监听器类,因为监听器类是外部类的内部类,2、所以可以自由访问外部类的所有界面组件。
这也是内部类的两个优势。
上面代码就是内部类的形式!!
第三种:Activity本身作为事件监听器
这种形式使用activity本身作为监听器类,可以直接在activity类中定义事件处理器方法,这种形式非常简洁。
但这种做法有两个缺点:(1)这种形式可能造成程序结构混乱。
Activity 的主要职责应该是完成界面初始化;但此时还需包含事件处理器方法,从而引起混乱。
(2)如果activity界面类需要实现监听器接口,让人感觉比较怪异。
上面的程序让Activity类实现了OnClickListener事件监听接口,从而可以在该Activity类中直接定义事件处理器方法:onClick(view v),当为某个组件添加该事件监听器对象时,直接使用this作为事件监听器对象即可。
第四种:外部类作为监听器
ButtonTest类
当用户单击button按钮时,程序将会触发MyButtonListener监听器
外部MyButtonListener类
使用顶级类定义事件监听器类的形式比较少见,主要因为如下两个原因:
1、事件监听器通常属于特定的gui界面,定义成外部类不篮球提高程序的内聚性。
2、外部类形式的事件监听器不能自由访问创建gui界面的类中的组件,编程不够简洁。
但如果某个事件监听器确实需要被多个gui界面所共享,而且主要是完成某种业务逻辑的实现,则可以考虑使用外部类的形式来定义事件监听器类。
第五种:直接绑定到标签
Android还有一种更简单的绑定事件监听器的的方式,直接在界面布局文件中为指定标签绑定事件处理方法。
对于很多Android标签而言,它们都支持如onClick、onLongClick等属性,这种属性的属性值就是一个形如xxx
(View source)
的方法的方法名。
在布局文件中为button添加属性,如一代码:
为Button按钮绑定一个事件处理方法:clickHanlder,这意味着开发者需要在该界面布局对应的Activity中定义一个void clickHanler(View source)方法,该方法将会负责处理该按钮上的单击事件。
下面是该界面布局对应的java代码:。