Android 处理UI事件

一、概述

  在Java和android中,通过事件来与各种输入设备进行沟通。

  事件是由OS产生的消息,当某个UI元素被用户以特定方式进行操作时,OS就会将事件消息发送给相应的View对象。

二、监听及事件处理

  “处理”(Handle)与“处理程序”(Handler)

三、View类处理UI事件

  在应用程序中,每一个UI元素都是彼此不同的实例化View对象,每一个对象都包含专属于该View对象的事件。

  在布局中,一个View对象是通过公共的回调(Callback)方法来与应用程序的其它部分进行沟通的,当某一个特定动作发生在该UI的View对象中时,Android就会调用指定的回调方法。

  在Android中提供了一套事件处理接口。在View类中嵌套了这些事件接口,通过它们可以定义回调方法。因为,它们是OS的一部分,组成了View类及其所有的方法。在View类中嵌套的接口就是事件监听器。

  1. 事件回调方法:

  事件监听器就是View类中的一个Java接口,里面包含了一个单独的回调方法。以下就是在Android中常用的回调方法:

  • onClick():来自View.OnClickListener类,在触摸屏幕或者点击UI元素时触发。
  • onLongClick():来自View.OnLongCliclListener类,触摸或按钮某个UI元素超过1秒触发。
  • onKey():来自View.OnKeyListener类,按下或释放键盘时触发。
  • onTouch():来自View.OnTouchListener类,在触摸、释放、手势事件时触发。
  • onFocusChange():来自View.OnFocusChange类,在焦点改变时触发。
  • onContextMenu():来自View.OnTouchListener类,上下文菜单。

四、事件绑定 

1. 为指定的UI元素添加onClick(...)事件监听器

 1 public class MainActivity extends Activity
 2 {
 3     private Context mContext;
 4 
 5     @Override
 6     public void onCreate(Bundle savedInstanceState)
 7     {
 8         super.onCreate(savedInstanceState);
 9         setContentView(R.layout.activity_main);
10 
11         mContext = getApplicationContext();
12 
13         // 获取Button对象,绑定事件监听器
14         Button syncBtn = (Button)findViewById(R.id.main_sync_btn1);
15         // 将Button控件与事件监听器进行绑定
16         syncBtn.setOnClickListener(new View.OnClickListener()
17         {
18             @Override
19             public void onClick(View v)
20             {
21                 // 选择触发监听器事件的UI元素View
22                 switch (v.getId())
23                 {
24                     case R.id.main_sync_btn1:
25                     {
26                         EditText editText = (EditText)findViewById(R.id.main_input_text1);
27                         TextView showText = (TextView)findViewById(R.id.main_input_text2);
28                         showText.setText(editText.getText());
29                         break;
30                     }
31                     default:
32                         Toast.makeText(mContext, mContext.getResources().getString(R.string.disable_event), Toast.LENGTH_SHORT).show();
33                         break;
34                 }
35             }
36         });
37     }
38 
39 }

 

2. 向活动添加onClick(...)监听器

 1 /**
 2  * @Classname MainActivity
 3  * @abstract 继承Activity类
 4  * @description 此类用于测试向活动添加onClick监听器,继承接口View.OnClickListener类
 5  * @throws
 6  */
 7 public class MainActivity extends Activity implements View.OnClickListener
 8 {
 9     private Context mContext;
10 
11     @Override
12     public void onCreate(Bundle savedInstanceState)
13     {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_main);
16 
17         mContext = getApplicationContext();
18 
19         // 获取Button对象,绑定事件监听器
20         Button syncBtn = (Button)findViewById(R.id.main_sync_btn1);
21         // 将Button控件与事件监听器进行绑定
22         syncBtn.setOnClickListener(this);
23     }
24 
25     // 覆盖View.OnClickListener接口类的onClick(...)方法
26     @Override
27     public void onClick(View view)
28     {
29         // 选择触发监听器事件的UI元素View
30         switch (view.getId())
31         {
32             case R.id.main_sync_btn1:
33             {
34                 EditText editText = (EditText)findViewById(R.id.main_input_text1);
35                 TextView showText = (TextView)findViewById(R.id.main_input_text2);
36                 showText.setText(editText.getText());
37                 break;
38             }
39             default:
40                 Toast.makeText(mContext, mContext.getResources().getString(R.string.disable_event), Toast.LENGTH_SHORT).show();
41                 break;
42         }
43     }
44 
45 }

  PS:注意,在继承View.OnClickListener接口类,要覆盖onClick(...)方法。同时,还要对触发事件的控件(Button)进行事件监听器绑定。

1 // 获取Button对象,绑定事件监听器
2 Button syncBtn = (Button)findViewById(R.id.main_sync_btn1);
3 // 将Button控件与事件监听器进行绑定
4 syncBtn.setOnClickListener(this);

 五、事件焦点

  当使用listView时,在view中添加button等控件,子控件会抢夺父控件的事件焦点,在父控件使用descendantFocusability属性设置其子控件不抢夺父控件事件焦点。

  属性的值有三种:

        beforeDescendants:viewgroup会优先其子类控件而获取到焦点

        afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点

        blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

posted @ 2016-04-06 14:19  naray  阅读(825)  评论(0编辑  收藏  举报