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会覆盖子类控件而直接获得焦点