宁波品牌网站推广优化公司,一个新手怎么做电商运营,普通网站建设的缺陷,免费做logo网站在安卓中#xff0c;有不止一种方法从你的应用截取用户交互事件。在你的用户界面中考虑事件#xff0c;途径就是从用户界面中的一个指定的view对象中捕获事件。该view提供了这样做的方法。 在你用来组成你布局的不同的view类中#xff0c;你或许注意到了一些公共的回调方法似…在安卓中有不止一种方法从你的应用截取用户交互事件。在你的用户界面中考虑事件途径就是从用户界面中的一个指定的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,nextFocusLeft, nextFocusRight, 和 nextFocusUp。将其中的一个属性添加到view上。该属性的值是下一个需要获取焦点的view的id。如下 LinearLayout android:orientationvertical ... Button android:idid/top android:nextFocusUpid/bottom ... / Button android:idid/bottom android:nextFocusDownid/top ... / /LinearLayout 通常在该垂直布局中从第一个按钮开始操纵(焦点)将不会跑去任何地方如果从第二个按钮开始操作(焦点)也不会跑到它的下面去。现在顶部按钮在底部定义了一个(按钮)同nextFocusUp设置一样(反之亦然)focus 焦点将会上-下 下-上的循环移动。 如果你想要在你UI中什么一个view是可聚焦的(当它一般情况下不是时)为view添加android:focusable xml属性在你的布局文件中声明。设置该值为true。你也可以声明该view的可聚焦性当在触摸模式时通过android:focusableInTouchMode. 为请求一个特别的view获得焦点调用requestFocus() 为监听焦点事件(当一个view获得或失去焦点时通知)使用onFocusChange()在上文#事件监听者(Event Listeners)中讨论的。