在安卓中,有不止一种方法从你的应用截取用户交互事件。在你的用户界面中考虑事件,途径就是从用户界面中的一个指定的view对象中捕获事件。该view提供了这样做的方法。

在你用来组成你布局的 不同的 view类中,你或许注意到了一些公共的回调方法似乎看起来对UI事件有用。这些方法由安卓的框架调用,当各自的操作在对象中发生时。例如,当一个view (一个按钮)被触摸,在这个对象中的 onTouchEvent() 方 法就会被调用。然而,为了拦截这个事件,你必须继承该类(button )并且重写该方法(onTouchEvent)。然而,为了处理这样的一个事件而继承每一个view对象或许不实际。这就是为什么View 类经常包含一组嵌套的调用接口让你可以跟方便的定义(事件处理方法)。这些接口,叫做事件监听者(   event listeners ),用来捕获用户与UI的交互。
当你更加平常的为你的用户交互使用事件监听者,当你想继承一个view类, 为了创建一个自定义组件, 或许可以使用一次。或许你想要继承 Button 类来让一些东西更加精美。在这样的情况下,你或许需要为你的类定义一个默认事件行为,使用该类的事件处理者( event handlers . ).

事件监听者(Event Listeners)

一个事件监听者是在view类中的一个接口,它包含了一个简单的回调函数。这些方法将会被安卓框架调用,当该view的监听者已经被注册并且通过用户ui 项被触发。
包含了事件监听者接口的都有如下回调方法:
onClick()

来自View.OnClickListener.。当用户触摸该item(触摸模式下),或者使用导航键或轨迹球使焦点聚集在该项上并且按下了适当的"enter"(进入)按键或者在轨迹球上执行了按下操作。
onLongClick()

来自  View.OnLongClickListener.。当用户持续触摸item时(触摸模式下),或者使用导航键或轨迹球使焦点聚集在该项上并且持续按着适当的"enter"(进入)按键或者在轨迹球上执行持续按下操作(持续一秒)。
onFocusChange()

来自  View.OnFocusChangeListener  当用户使用导航键或者轨迹球导航到或者离开该item 时。
onKey()

来自View.OnKeyListener. 当用户聚焦在了项目上并且按下或松开设备上的按键时
onTouch()

来自View.OnTouchListener.当用户执行一个合格的触摸操作,包括按下,释放或者任何屏幕上的手势动作(在项目的边界内)
onCreateContextMenu()

来自View.OnCreateContextMenuListener. 当上下文菜单开始构建时调用(如持续“长按”的结果)。查看在  Menus开发向导中关于上下文菜单的讨论。
这些方法是它们各自接口的唯一方法。为定义其中的一个方法并且处理你的事件,在你的activity中实现嵌套的接口,或者作为一个匿名类定义它。然后,传递一个你的实例引用给各自的 View.set...Listener()方法。  method (例如,调用 setOnClickListener()并且传递一个你实例化的 OnClickListener )
下面一个案例展示了如何为一个按钮注册一个on-click监听者。
   
// 为OnClickListener创建一个匿名实例
private OnClickListener mCorkyListener = new OnClickListener() {
public void onClick(View v) {
// do something when the button is clicked
}
};
 
protected void onCreate(Bundle savedValues) {
...
// Capture our button from layout
Button button = (Button)findViewById(R.id.corky);
// Register the onClick listener with the implementation above
button.setOnClickListener(mCorkyListener);
...
}

你可以更加方便的找到实现 OnClickListener  ,作为activity的一部分。这将会避免额外的类加载和对象分配。如下:
   
public class ExampleActivity extends Activity implements OnClickListener {
protected void onCreate(Bundle savedValues) {
...
Button button = (Button)findViewById(R.id.corky);
button.setOnClickListener(this);
}
 
// Implement the OnClickListener callback
public void onClick(View v) {
// do something when the button is clicked
}
...
}

注意上文示例中的 onClick()  回调并没有返回值,但是一些其它的事件处理方法必须返回一个布尔类型。原因取决于事件。这里有少数的一些原因:
  • onLongClick() - 该方法返回一个布尔类型来指明你是否消耗了该事件,并且它不应该进一步传递下去。也就是说,返回true表明你处理了该事件并且它应该在这停下来;返回false,如果你没有处理它或者该事件应该继续传递给其它on-click监听者。
  • onKey() - 该方法返回一个布尔类型来表明你是否消耗了该事件并且不应该进一步传递下去。也就是说,返回true表明你处理了该事件并且它应该在这停下来;返回false,如果你没有处理它或者该事件应该继续传递给其它on-click监听者。
  • onTouch() - 该方法返回一个布尔类型来表明你是否消耗了该事件。重要的是该事件可以有多个符合触发条件的操作。因此,当按下事件被接受到,如果你返回了false,表明你没有处理该事件并且对这个事件的后续行动不感兴趣。因此,你不会为每一个操作都调用该事件,如手势动作,或者最后的抬手动作(up action event)。
请记住,硬件按钮事件总是传递给当前焦点视图。从view的顶层开始向下分发,直到到达适当的地方。如果你的view(或者在view中的子view)获得了焦点,之后你可以通过 dispatchKeyEvent()方法 查看到事件的移动。作为一个备选方法来从你的view中捕获按键事件,你还可以在你activity中的 onKeyDown()  和 onKeyUp() .内 收到各种事件。
并且,当你的应用输入文本时,需要注意的是许多设备只有软件的输入方法。这些方法不需要按键支持,或使用声音输入,手写,等等。即使一个输入方法呈现了一个类似键盘的界面,它通常也不会触发 onKeyDown()这类的事件。你永远不应该创建UI来约束指定按键的按压,除非你想要限制你应用使用设备的硬件盘。特别的,当用户按下返回按钮时,不要依赖于这些方法来确认输入;改为使用像 IME_ACTION_DONE一样的操作来表明该输入方法并且让你的应用程序做出怎样的反应。这可能会以一种有意义的方式来改变它的UI。避免设想一个软件输入方法应该是如何工作的,并且只需要信任它来为你的应用支持已经格式化的文本。
注意:安卓将会首先调用事件处理者,之后调用类中定义的适当的默认处理者。同样的,从这些事件监听者中返回true将会停止事件传播给其它事件监听者,并且阻塞view中的默认事件处理的回调。因此,当你返回true时,确定你想要终止该事件。

事件处理者(Event Handlers)

如果你想自定义一个view组件,那么你可能会定义一些回调方法作为默认的事件处理者来使用。在 Custom Components , 这篇文章中,你将会看到一些被用作事件处理的公共回调函数,包括:
  • onKeyDown(int, KeyEvent) - 当一个新的按键事件发生时调用
  • onKeyUp(int, KeyEvent) - 当一个按键松开(key up )事件发生时调用
  • onTrackballEvent(MotionEvent) - 当一个轨迹球运动事件发生时
  • onTouchEvent(MotionEvent) - 当一个屏幕触摸事件发生时
  • onFocusChanged(boolean, int, Rect) - 当该view获得或失去焦点时
这还有其他的一些你需要注意的方法,它们不是view类的一部分,但是可以直接影响你能处理事件的方式。因此,当在你的布局中管理更多复合事件时,考虑这些方法:
  • Activity.dispatchTouchEvent(MotionEvent) -允许你的activity拦截所有的触摸事件,在他们分发给window之前。
  • ViewGroup.onInterceptTouchEvent(MotionEvent) - 允许一个viewgroup 来观察事件是否派遣给了子view。
  • ViewParent.requestDisallowInterceptTouchEvent(boolean) -调用该方法取决于父视图,表明它不应该通过onInterceptTouchEvent(MotionEvent).拦截触摸事件。

触摸模式(Touch Mode)

当用户使用方向键或轨迹球在用户界面上移动时,给予活动项(如按钮)焦点是必须的,这样用户可以看见什么输入将会被接受。如果该设备有触摸能力,并且用户开始通过触摸来与界面交互,那么并不需要高亮显示项目,或者给指定view 一个焦点。因此,有一个交互模式叫做“触摸模式”(当今的安卓手机主要是该模式,因它没有硬件输入设备)
对于一个可触摸的设备,移动用户触摸了屏幕,设备将会进入触摸模式。从此刻开始,只有当view因为 isFocusableInTouchMode()为true时才可被聚焦,如文本编辑组件。其它view都是可触摸的,如按钮,在触摸时将不会获得焦点;当按下时,他们仅仅的激活他们的on-click 监听者。
任何时候,用户点击一个方向键或滑动轨迹球,设备将会退出触摸模式并且找到一个view使其获得焦点。现在,用户可以继续与用户界面交互,不使用触摸屏幕这种方式。
触摸模式状态一直维持在整个系统中(所有Windows和activitys ).为查询当前状态,你可以调用 isInTouchMode()  来查看设备当前是否处于触摸模式。

处理焦点(Handling Focus )

框架将会处理常规响应用户输入时的的焦点移动。这包括当view移除或隐藏时改变焦点,或一个新的view变为可用。view通过 isFocusable()方法来表明他们获得焦点的意愿。改变view是否能获得焦点,调用 setFocusable()。当处于触摸模式,你或许需要通过 isFocusableInTouchMode() 查询一个view是否允许聚焦。通过使用 setFocusableInTouchMode() 你可以改变它。
焦点的移动是基于一个算法的,它顺着一个给定的方向寻找最近的(view)。少数情况下,默认算法或许不符合开发者的要求。在这种情况下,你可以提供详细的覆盖,通过在布局文件中使用如下xml 属性: nextFocusDown , nextFocusLeftnextFocusRight , 和  nextFocusUp。 将其中的一个属性添加到view上。该属性的值是下一个需要获取焦点的view的id。如下:
  
<LinearLayout
android:orientation="vertical"
... >
<Button android:id="@+id/top"
android:nextFocusUp="@+id/bottom"
... />
<Button android:id="@+id/bottom"
android:nextFocusDown="@+id/top"
... />
</LinearLayout>

通常,在该垂直布局中,从第一个按钮开始操纵(焦点)将不会跑去任何地方,如果从第二个按钮开始操作,(焦点)也不会跑到它的下面去。现在顶部按钮在底部定义了一个(按钮)同 nextFocusUp设置一样(反之亦然), focus   焦点将会上-下 下-上的循环移动。
如果你想要在你UI中什么一个view是可聚焦的(当它一般情况下不是时),为view添加 android:focusable  xml属性,在你的布局文件中声明。设置该值为true。你也可以声明该view的可聚焦性,当在触摸模式时通过 android:focusableInTouchMode .
为请求一个特别的view获得焦点,调用 requestFocus()
为监听焦点事件(当一个view获得或失去焦点时通知),使用 onFocusChange(),在上文 #事件监听者(Event Listeners)中讨论的。

Input Events(输入事件)相关推荐

  1. 安卓 Input Events(输入事件)

    在安卓中,有不止一种方法从你的应用截取用户交互事件.在你的用户界面中考虑事件,途径就是从用户界面中的一个指定的view对象中捕获事件.该view提供了这样做的方法. 在你用来组成你布局的不同的view ...

  2. vue输入框输入触发事件_.vue文件中监听input输入事件oninput详解

    .vue文件其实是一个组件,关于它的说明我之前也写过一篇文章,地址:.vue文件,今天这篇文章要讲的是.vue文件中监听input的输入值变化事件.需求是这页面中,改变input的值,就调用一个事件, ...

  3. 【杂记】(input获取焦点失去焦点、获取input中输入的值、 键盘事件、js事件、Math 属性、手机自适应meta定义、 去掉input内置阴影、图片居中、去蓝色默认背景、点击去掉默认边框)

    1. input获取焦点失去焦点 input:focus{border:1px red solid:} 获取焦点 .focus()失去焦点.blur() 2. 获取input中输入的值 <inp ...

  4. html输入框禁止输入汉字,input输入框输入中文时,监听的input事件怎样屏蔽拼音状态...

    在input输入框输入中文时,需要即时查询出匹配输入内容的结果,一般我们会使用input事件监听用户输入事件,但是在输入汉语拼音时,也会触发input事件,前端就会不断发送请求,用户体验非常差劲. 针 ...

  5. html 输入框输入事件,input 输入框内的输入事件详细分析

    1.基础:本次分析原理就是在各个浏览器下input内容变化的时候触发事件的各种不兼容性.在ie下用onpropertychange事件,在其他浏览器里用input事件. 2.用例:对每个浏览器分别测试 ...

  6. Linux输入事件类型EV_SW,Linux的input输入子系统:总体框架

    一.input输入子系统总体框架 Linux输入子系统将输入驱动抽象为三层:设备驱动层.核心层.事件处理层. 设备驱动层:将底层的硬件输入事件转化为统一事件形式,向输入核心(Input Core)汇报 ...

  7. vue输入框输入触发事件_详解.vue文件中监听input输入事件(oninput)

    详解.vue文件中监听input输入事件(oninput) .vue文件其实是一个组件,关于它的说明我之前也写过一篇文章,地址:.vue文件,今天这篇文章要讲的是.vue文件中监听input的输入值变 ...

  8. JavaScript表单事件 获取焦点:focus 失去焦点:blur 输入事件:input 变化事件:change

    JavaScript表单事件 焦点处理 焦点处理主要包括focus(获取焦点)和blur(失去焦点)事件类型.所谓焦点,就是激活表单字段,使其可以响应键盘事件. 获取焦点:focus 当单击或使用Ta ...

  9. html5输入法完成事件,监听Input在中文输入法下输入事件

    正常情况下,如果想要监听输入框的输入事件并做一些其他的事比如实时搜索啥的,可以通过 input.addEventListener('input', function(event) {//do some ...

最新文章

  1. php正则邮箱验证,php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)...
  2. tanh函数matlab_MATLAB 基本函数
  3. [转]double free or corruption (!prev): 0x080644c8 ***
  4. MySQL高级 - 存储引擎 - 概述
  5. qt 安装mysql_qt 安装mysql数据库
  6. mongodb存储数据_在MongoDB中存储分层数据
  7. 为什么说任何基于比较的算法将 5 个元素排序都需要 7 次?
  8. SpringBoot 自带工具类~StringUtils
  9. 马斯克开始行动:下调Twitter Blue订阅费 禁止广告
  10. 第四章 选择结构(二)
  11. java代码用户界面网格布局GridLayout.划分为格子区域
  12. Arrays.asList( ) 返回一个特殊的“ArrayList”
  13. Unity 3D 热更新之基于 Asset Bundle Browser 的 AssetBundle包
  14. 月薪6000艰难追上海美女路
  15. 网页加速之Prefetching VS Prerendering
  16. Android设置TabLayout下划线宽度,靠谱版本!
  17. 中国互联网的巨头们,为何敢“大数据杀熟”?
  18. 最简单的加载器免杀思路
  19. poi删除带有合并单元格的行的问题
  20. 苹果保修期_苹果手机怎么查看保修期 查询有效保修状态日期方法

热门文章

  1. 解决Error resolving template [x] template might not exist or might not be accessible by any of the con
  2. asp.net实习管理系统
  3. switch课堂练习
  4. linux解压缩命令 tar gz,linux解压缩命令
  5. 还在用ppt数据分析图表制作吗,不试一下bi?
  6. 七战升鸿蒙需要什么条件,正式确定!升级鸿蒙系统有限制条件,麒麟710芯片以上机型才可以!...
  7. CM201-2-ZG-Hi3798MV300/MV300H/MV310-当贝纯净桌面-卡刷固件包
  8. 【励志】他只靠写代码,登上了胡润富豪榜!
  9. 用stl函数来实现二分查找
  10. 基于SSM框架的音频分享平台的设计与实现计算机毕业设计源码74192