Android API Guides---Input Events

来源:互联网 发布:mysql create trigger 编辑:程序博客网 时间:2024/06/05 19:26

Input Events

在Android上,有拦截从用户的交互事件与应用程序的方法不止一种。当考虑用户界面内的事件,该方法是捕捉从用户与之交互的特定视图对象的事件。 View类提供了这样做的手段。


内,你会用它来撰写你的布局不同的视图类,你可能会注意到,寻找有用的UI事件几个公共回调方法。这些方法由Android框架时,相应的操作的对象发生调用。例如,当一个视图(如一个按钮)被触摸时,onTouchEvent()方法被调用的对象。然而,为了拦截这一点,你必须扩展类并重写的方法。然而,为了处理这样的事件延伸每个视图对象是不实际。这就是为什么视图类也包含嵌套的接口与回调,你可以更容易地定义一个集合。这些接口被称为事件侦听器,是您的机票,以捕捉你的UI用户的交互。


虽然你就会更经常使用的事件监听器来监听用户交互,有可能来的时候,你想扩展视图类,以建立一个自定义组件。也许你想扩展Button类,使更多的东西花哨。在这种情况下,你就可以定义默认事件行为使用类的事件处理程序类。


事件监听器


一个事件监听器是包含一个回调方法View类的接口。这些方法会被Android框架时,该监听器已注册的观点是通过用户交互在用户界面中的项目引发的调用。


包括在事件侦听器接口是以下回调方法:

onClick()

从View.OnClickListener。当用户或触摸的项目(在触摸模式时),或者与导航键侧重于该项目或轨迹球并按压合适的“输入”键或压在轨迹球此被调用。

onLongClick()

从View.OnLongClickListener。当用户或触摸并保持产品(当在触摸模式),或集中在与导航键的项目或轨迹球和按压并保持合适的“输入”键或按压并保持下来轨迹球(这被称为一秒钟)。

onFocusChange()

从View.OnFocusChangeListener。当用户导航到或从项远,使用导航键或轨迹球此被调用。

onKey()

从View.OnKeyListener。当用户集中在信息并按下或释放装置上的硬件键此被调用。

onTouch()

从View.OnTouchListener。当用户执行资格作为一个触摸事件的行动,包括一压机,释放,或任何运动手势在屏幕上(该项目的范围内),这是调用。

onCreateContextMenu()

从View.OnCreateContextMenuListener。当一个上下文菜单正在建设(作为持续“长按”的结果),这就是所谓的。查看菜单开发者指南中的上下文菜单的讨论。
这些方法均是其各自接口的唯一居民。要定义这些方法之一,并处理您的事件,实现你的活动嵌套接口或把它定义为一个匿名类。然后,通过您的实现各自的View.set...监听()方法的一个实例。 (例如,呼叫setOnClickListener(),并通过它你的OnClickListener的执行情况。)


下面的例子说明如何注册的点击监听器的按钮。

// Create an anonymous implementation of OnClickListenerprivate 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作为活动的一部分。这将避免额外的类加载和对象分配。 例如:

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如果你还没有处理它和/或事件应继续任何其他的点击监听器。
安其() - 这将返回一个布尔值,指示是否已消耗的事件,不应该再进行。也就是说,返回true表明您已经处理的事件,它应该到此为止;返回false如果你还没有处理它和/或事件应继续其他的键侦听器。
onTouch() - 这将返回一个布尔值,表明你的听众是否消耗了本次活动。重要的是,这一事件可以有相互跟随的多个动作。所以,如果你在收到向下的动作时返回false,即表示您还没有消耗的事件,也没有兴趣从这个事件的后续操作。因此,你将不会被要求对事件中的任何其他操作,如手指的手势,或最终采取后续行动的事件。
请记住,硬件密钥事件总是传递到当前视图中的焦点。他们被分派View层次结构的顶部开始,再往下,直到他们达到相应的目标。如果您的视图(或您查看的孩子)当前具有焦点,然后就可以看到通过dispatchKeyEvent()方法的情况下出行。作为替代,通过您的浏览捕获关键事件,还可以接收所有事件的活动里面加上的onkeydown()和的onkeyup()。


此外,考虑为您的应用程序文本输入时,请记住,许多设备只有软件输入法。这样的方法是基于密钥的不要求;一些可以使用语音输入,手写,等等。即使输入方法提出了一个类似键盘的接口,它通常将不会触发事件的onkeydown()系列。你不应该建,除非你想你的应用程序限制与硬件键盘设备需要被控制的特定按键的UI。尤其是,不要依赖这些方法,当用户按下回车键确认输入;相反,使用操作,如IME_ACTION_DONE信号您的应用程序期望如何应对输入法,所以它可能以一种有意义的方式改变它的UI。避免对一个软件输入法应该如何工作的假设,只是相信它已经格式化的文本提供给您的应用程序。


注:Android将先调用事件处理程序从类定义第二适当的默认处理程序。因此,从这些事件侦听器返回true将停止事件其它事件侦听器的传播,也将阻止回调在查看默认的事件处理程序。因此,可以肯定,你想,当你返回true终止事件。


事件处理程序


如果您正在构建从View自定义组件,那么你就可以定义使用的默认事件处理几个回调方法。在有关自定义组件文件,你会学到看到一些用于事件处理,包括常见的回调:


的onkeydown(INT,KeyEvent)方法 - 当调用一个新的关键事件发生。
的onkeyup(INT,KeyEvent)方法 - 当一个关键事件发生时调用。
onTrackballEvent(MotionEvent) - 时调用轨迹球移动事件发生。
onTouchEvent(MotionEvent) - 当调用触摸屏移动事件发生。
onFocusChanged(布尔,INT,矩形) - 当调用视图获得或失去焦点。
还有一些其他的方法,你应该知道,这是不是View类的一部分,但可以直接影响你能够处理事件的方式。因此,管理布局内比较复杂的事件时,应考虑其他方法:


Activity.dispatchTouchEvent(MotionEvent) - 这让你的活动,以拦截所有触摸事件,他们被分派到了窗口前。
ViewGroup.onInterceptTouchEvent(MotionEvent) - 这使得他们被分派到子视图的ViewGroup一看事件。
ViewParent.requestDisallowInterceptTouchEvent(布尔) - 调用此对父视图,以表明它不应该拦截触摸事件与onInterceptTouchEvent(MotionEvent)。
触摸模式


当用户使用导航方向键或轨迹球的用户界面,有必要给予重点可操作的项目(如按钮),使用户可以看到什么都会接受输入。如果设备具有然而触摸功能,并且用户通过触摸它开始与界面交互,则它不再是必要的,以突出显示的项目,或者给予聚焦到特定的观。因此,存在命名为交互的模式“触摸模式”。


用于触摸能力的设备中,一旦用户触摸屏幕,设备将进入触摸模式。从这点起,只观为哪些isFocusableInTouchMode()为真将成为焦点,诸如文本编辑窗口小部件。其他意见是可触,如按钮,将不会触碰时重点;按下时他们会简单地解雇他们的点击监听器。


任何一个用户点击方向键或使用滚动轨迹球时,设备将退出触摸模式,并找到一个合理把握重点。现在,用户可以恢复而不接触屏幕与用户界面交互。


触摸模式状态被保持在整个系统(所有窗口和活动)。要查询目前的状态,你可以调用isInTouchMode()来查看设备当前是否处于触摸模式。


处理焦点


该框架将根据用户的输入处理日常的焦点移动。这包括作为视图被删除或隐藏,或作为新的浏览变得可用改变焦点。意见表示愿意通过isFocusable()方法来接受焦点。更改视图是否可以采取焦点,调用setFocusable()。在触摸模式时,您可查询查看是否允许与重点isFocusableInTouchMode()。你可以用setFocusableInTouchMode改变这种()。


焦点移动是基于该发现在给定的方向上的最近的邻居的算法。在极少数情况下,默认的算法可能不符合开发商的预期行为。在这些情况下,可以为用户提供在布局文件中的以下XML属性明确覆盖:nextFocusDown,nextFocusLeft,nextFocusRight和nextFocusUp。添加这些属性从中焦点离开观之一。定义的属性的值是焦点应给予该视图的ID。例如:

<LinearLayout    android:orientation="vertical"    ... >  <Button android:id="@+id/top"          android:nextFocusUp="@+id/bottom"          ... />  <Button android:id="@+id/bottom"          android:nextFocusDown="@+id/top"          ... /></LinearLayout>
通常,在该垂直布局中,从第一按钮向上导航不会去任何地方,也不会从第二按钮导航下来。现在,顶部的按钮定义了一个底部为下一个焦点上(反之亦然),导航焦点将循环从顶部至底部和底部到顶部。
如果您想宣布在UI的视图,作为聚焦的(当它是历来没有),添加了android:聚焦的XML属性来看,在布局声明。设定值true。您也可以声明查看可聚焦,而在触摸模式与Android:focusableInTouchMode。
要请求特定View采取集中,调用requestFocus()方法。
要收听焦点事件(当查看接收或失去焦点通知),请使用onFocusChange(),如在事件监听器部分,如上所述。


0 0
原创粉丝点击