`
itoracja
  • 浏览: 142960 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android开发中的UI控制(七)

    博客分类:
  • java
阅读更多
     
[size=large;]android开发中的ui控制(七)[/size]
[size=medium;]<br>[/size]
[size=medium;]转载自 http://www.android777.com/index.php/tutorial/android-view/androids-ui-control-g.html<br>[/size]
[size=medium;]<br>[/size]
[size=medium;]到这里大家应该都会使用一些简单控件、有趣的控件结合布局管理对象来创建一些简单的界面了。可是如果光只有界面而没有对应的ui交互的话那整个应用就像一幅画一样,只能看不能编辑修改。所以我们要学会处理一些ui事件,让整个应用能“活起来”,而不是看起来就像是几张图拼起来的。[/size]
[size=medium;]</span>
[size=medium;]在android中,我们用拦截事件来处理ui交互。当用户触摸屏幕、点击按钮、输入文字时都会触发对应的事件。我们通过拦截这些事件,在事件发生之前或之后插入一些代码来实现ui交互。[/size]
[size=medium;][/size]
[size=medium;]首先我们要知道android使用的是跟java gui一样的单线程事件模型,系统有将所有ui事件按照发生顺序推入一个eventqueue中,然后有一个ui线程专门将事件从eventqueue中移除,然后执行它,<a title="android中的ui控制(二)" href="http://www.android777.com/index.php/tutorial/androids-ui-control-b.html" target="_blank">具体看这里</a>。为了让每个view都能响应事件,view提供了几个常用的回调方法用来响应事件。比如一个button对象,当你在触摸屏上点击它时,系统就会产生一个触摸事件,然后调用button对象中的ontouchevent方法。为了要拦截这个事件,你可以扩展button对象重写里面的ontouchevent方法,在里面插入你需要完成的逻辑代码。但是一个界面一般都是由多个view对象组成的,如果每个view对象都需要被扩展然后重写对应的事件代码,那编码上就很难,也很难维护。所以view对象里也提供了一系列的内部接口,让你可以通过它们去捕捉对应的事件,这些内部的接口就叫:eventlistener。[/size]
[size=medium;][/size]
[size=medium;]对应不同的事件类型,android在view里内置了不同的eventlistener。你需要将这些不同类型的eventlistener注册到view对象,那么当view对象触发了对应的事件后就会调用注册这个事件的eventlistener。几个常用的eventlistener有:[/size]
[size=medium;][/size]
[size=medium;]点击事件:[/size]
[size=medium;][/size]
[size=medium;]view.onclicklistener :注册事件后(通过调用view.setonclicklistener),当用户点击或者触摸视图时会调用这个接口定义的方法。[/size]
[size=medium;][/size]
[size=medium;]view.onlongclicklistener:注册事件后(调用view.setonlongclicklistener),当用户长按住某个视图时调用这个接口。[/size]
[size=medium;][/size]
[size=medium;]view.onfocuschangelistener:注册事件后(通过view.setonfocuschangelistener),当当前视图焦点变化时会调用这个接口。[/size]
[size=medium;][/size]
[size=medium;]view.onkeylistener:注册事件后(通过view.setonkeylistener),当视图接受到键盘事件时会调用这个接口。[/size]
[size=medium;][/size]
[size=medium;]view.ontouchelistener:注册事件后(通过view.setontouchlistener),当用户在触摸屏上触摸、释放、移动手指时会调用这个接口。[/size]
[size=medium;]<br>[/size]
[size=medium;][/size]
[size=medium;]下面演示如何给一个按钮注册点击事件:[/size]
[size=medium;][/size]
[size=medium;]1.直接用匿名接口实现类对按钮添加事件,它的好处是代码简洁,缺点是当有很多个view对象时,代码会比较难维护:[/size]
package com.android777.demo.uicontroller; import android.app.activity;import android.os.bundle;import android.view.view;import android.widget.button;import android.widget.toast; public class listenerdemoactivity extends activity {     @override    protected void oncreate(bundle savedinstancestate) {        super.oncreate(savedinstancestate);         setcontentview(r.layout.listener);         button b1 = (button) findviewbyid(r.id.button1);         b1.setonclicklistener(new view.onclicklistener() {             @override            public void onclick(view v) {                 toast.maketext(listenerdemoactivity.this,                               "您点击了按钮",                               toast.length_long).show();             }        });     } }
  
 
[size=medium;]2. 将ui事件的处理代码交由activity来处理,这时候你的activity需要多实现一个onclicklistener接口。它的好处是代码比较简洁,可以由activity来同时当做好几个view的事件处理对象:[/size]
package com.android777.demo.uicontroller; import android.app.activity;import android.os.bundle;import android.view.view;import android.view.view.onclicklistener;import android.widget.button;import android.widget.toast; public class listenerdemoactivity extends activity implements onclicklistener{     @override    protected void oncreate(bundle savedinstancestate) {        super.oncreate(savedinstancestate);         setcontentview(r.layout.listener);         button b1 = (button) findviewbyid(r.id.button1);         b1.setonclicklistener(this);     }     @override    public void onclick(view v) {        toast.maketext(listenerdemoactivity.this,                   "您点击了按钮",                   toast.length_long).show();    } }
  
 
 
[size=medium;] 3. 在布局文件的xml中定义引用到这个xml文件的activity中哪个方法要处理对应的按钮事件(这个很简洁明了,不过有点违背了mvc的理念,它在 sdk1.6+ 才有支持):[/size]
[size=medium;]listener.xml:[/size]
<?xml version="1.0" encoding="utf-8"?><linearlayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="fill_parent">     <button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="一个按钮"        android:id="@+id/button1"        android:onclick="onbutton1click"    /> </linearlayout>
  
[size=medium;] java代码:[/size]
package com.android777.demo.uicontroller; import android.app.activity;import android.os.bundle;import android.view.view;import android.widget.toast; public class listenerdemoactivity extends activity{     @override    protected void oncreate(bundle savedinstancestate) {        super.oncreate(savedinstancestate);         setcontentview(r.layout.listener);     }     //xml中定义的按钮事件代码, 方法签名必须是  public void xxxx(view);    public void onbutton1click(view v) {        toast.maketext(listenerdemoactivity.this,                   "您点击了按钮",                   toast.length_long).show();    } }
  
 
[size=medium;] 三种写法的运行效果都是一样的:[/size]
[size=medium;]<br>[/size]
[size=medium;]<br><img src="http://dl.iteye.com/upload/attachment/532779/d1f89d8e-4d77-3c41-9bfb-65fec5753d13.png" alt="">[/size]
[size=medium;]<br>[/size]
[size=medium;]<br> [/size]
[size=medium;]上面的事件处理代码onclick没有返回值。但是有很多其他的事件处理代码需要返回一个boolean值,为什么需要一个返回值呢?这跟这些事件的性质有关,看下面:[/size]
[size=medium;]onlongclick:它需要一个返回值来指示android事件处理系统,是否在这个方法里已经销毁了这个事件(都完成了,不需要交给其他处理)或者不处理这个事件,由其他的注册view来处理。如果返回true值,表示这个事件已经处理完了,可以直接销毁,返回false表示这个事件还没处理完成,由android事件处理系统将这个事件交给其他注册的eventlistener进行再处理。[/size]
[size=medium;]onkey:跟onlongclick差不多,返回true表示处理完成,返回false则交由其他注册的eventlistener处理。[/size]
[size=medium;]ontouch:这个比较不一样,因为ontouch后还有很多其他的动作。如果返回true,就表示事件已经处理完成,则后面发生的移动手指,释放手指动作就都被忽略掉。[/size]
[size=medium;]有一点需要注意的是keyevent键盘事件会被传递到当前有焦点的view对象中,它的传递过程是一个从顶至下的过程,假设你一个view对象嵌套在2层的view对象里,如果上层的view对键盘事件返回true值,则事件就不会传递到当前焦点的view对象中。[/size]
[size=medium;]触摸模式:[/size]
[size=medium;]一般的不是触摸屏的手机,你需要使用方向键将当前焦点在多个视图内转换,焦点只会跳到一些具备焦点的view对象。如果手机是触摸屏的,你就需要使用手指触摸来点击一些view,这时候很多对象将没有焦点可以看到,如输入框还能看到焦点、按钮就看不到焦点状态。当你用手指触摸屏幕产生触摸事件时,系统就会进入触摸模式。在触摸模式中,只有view.isfocusableintouchmode()方法返回true的值,才具备焦点。所以你在edittext里调用这个方法会返回true,而在button中则返回false,当你触摸按钮时则会触发onclick事件。[/size]
[size=medium;][/size]
[size=medium;]当用户使用方向键时则退出触摸模式,系统将按照一般设备来执行。是否触摸模式是由系统来维护的,你可以通过调用window或activity中的isintouchmode方法来判断现在系统所处的模式。[/size]
<span style="font-size: medium;"><br>[/size]
 
0
7
分享到:
评论

相关推荐

    安卓Android源码——ui开发类库示例源码.zip

    6. **DialogFragment**:对话框在Android应用中广泛应用,DialogFragment是Android官方推荐的方式,它继承自Fragment,可以方便地管理和控制对话框的显示与消失。 7. **动画(Animation)**:Android支持属性动画...

    Android8.1 SystemUI源码

    本文将深入探讨Android 8.1版本的SystemUI源码,介绍其结构、工作原理以及如何利用提供的gradle配置进行开发。 首先,让我们来看看`SystemUI`的构成。SystemUI组件主要由以下几个部分组成: 1. **StatusBar**:...

    android 7.0 SystemUI

    在Android系统架构中,SystemUI位于应用层与系统服务层之间,它提供了通知中心、状态栏、快速设置面板、锁屏界面以及各种系统级别的交互控件。深入理解SystemUI的源代码对于开发者优化系统UI性能、自定义系统行为或...

    新版Android开发教程+笔记七--基础UI编程1

    标题和描述提及了“新版Android开发教程+笔记七--基础UI编程1”,以及“安卓开发必备”,因此本篇内容将主要围绕Android基础UI编程展开。 Android UI编程是构建Android应用界面的核心部分。它涉及到使用各种布局和...

    Android UI设计心得

    尽管AbsoluteLayout在Android SDK 2.3.3之后不再推荐使用,但在早期版本中,它可以允许开发者精确控制每个子视图的位置,通过设置`android:layout_x`和`android:layout_y`属性。然而,由于其不适用于不同屏幕尺寸和...

    Android开发自定义View之仿米家APP双色灯控制UI:做一个智能家居产品的简单智能灯UI !

    Android开发自定义View之仿米家APP双色灯控制UI:做一个智能家居产品的简单智能灯UI https://blog.csdn.net/xh870189248/article/details/80486158

    老罗Android开发视频教程 (android常用UI编程) 26-33集源码

    在本资源中,"老罗Android开发视频教程 (android常用UI编程) 26-33集源码.zip"是一个包含Android应用开发教学内容的压缩文件。老罗,可能指的是知名的技术讲师罗永浩,以其通俗易懂的讲解风格而闻名。这个教程聚焦于...

    Android新手UI集合全

    在Android开发领域,UI设计是至关重要的一环,它直接影响到应用程序的用户体验和视觉吸引力。"Android新手UI集合全"这个资源包,显然为初学者提供了一整套的UI设计元素,帮助他们快速理解和实践Android应用界面的...

    android开发 获取UI十六进制颜色码 工具

    在Android开发过程中,UI设计是至关重要的一个环节,而颜色管理是UI设计中的核心部分。开发者经常需要知道屏幕上的各种UI元素所使用的具体颜色值,以便在代码中精确地重现这些颜色。本教程将详细介绍如何获取UI的...

    Android things简单的UI

    总之,Android Things提供了将Android的丰富UI开发经验应用于物联网设备的机会。通过理解如何在有限的硬件资源上构建和管理UI,开发者可以创造出功能强大且直观的物联网解决方案。sample-simpleui项目就是一个很好的...

    androidUI设计器

    Android UI 设计器是Android开发中的一个重要工具,它允许开发者直观地设计应用程序的用户界面,无需手动编写XML布局代码。这个工具极大地提升了开发效率,使得非程序员也能参与到UI设计中来,实现快速预览和调整...

    android 仿锤子UI布局

    在Android开发中,锤子手机以其独特的UI设计风格赢得了众多用户的喜爱。为了实现类似锤子UI的布局,开发者需要深入理解Android布局系统,并掌握一些特殊的设计技巧。本篇将主要探讨如何在Android中仿制锤子UI的格子...

    android项目整体UI框架

    在Android应用开发中,UI框架的设计是至关重要的,它直接影响到应用的用户体验和代码的可维护性。"android项目整体UI框架"这个主题主要涵盖了三个方面:自定义Android项目的底部任务栏、实用Fragment的切换以及项目...

    android 音乐开发 ui素材

    "android 音乐开发 UI素材"这个主题涉及到的是应用程序用户界面中的图形元素,尤其是针对音乐播放功能的按钮和布局设计。酷狗音乐和网易云音乐是两款在中国非常流行的音乐应用,它们的UI设计被广大用户所接受和喜爱...

    Android UI统一框架

    在Android开发中,UI设计和实现是至关重要的部分。为了提高代码的可维护性和复用性,开发者常常会构建一个统一的UI框架。这个框架旨在规范应用中的界面设计,简化多维度UI管理,减少代码冗余,提升开发效率。本文将...

    android模仿易信UI布局效果源码

    在Android开发中,模仿流行的移动应用UI布局是提升用户体验和设计水平的重要步骤。易信,作为一款在中国广受欢迎的即时通讯应用,其简洁而高效的设计风格深受用户喜爱。本源码项目专注于重现易信的UI布局,帮助...

    [毕设季 android开发]第六讲:Android线程及UI更新

    在Android应用开发中,线程管理和UI更新是至关重要的部分,因为Android系统为每个应用程序分配一个主线程,也称为UI线程。主线程主要负责处理用户界面的交互,包括绘制和更新视图。然而,执行耗时的操作(如网络请求...

    android UI 各种小例子

    在Android开发中,UI设计是至关重要的一环,它关乎到应用程序的用户体验和视觉吸引力。本压缩包中的"android UI 各种小例子"为初学者提供了丰富的实践资源,旨在帮助开发者掌握基本的Android用户界面设计技巧。每个...

    Android开发入门60个小案例+源代码

    在Android开发领域,初学者经常会面临许多挑战,如理解Android应用程序的基本架构、学习XML布局、掌握Java或Kotlin编程语言,以及如何与...在学习过程中,建议结合官方文档和其他教程,以全面、深入地学习Android开发。

Global site tag (gtag.js) - Google Analytics