EditText内容不能被删除?
1,436 views, Android, by iStar.不知道各位同学有没有碰到EditText内容不能删除(但是可以输入)的现象,我估计这种情况的重现率比较低,反正我在Google上没看到。但是几率这么小的情况昨天被我碰到了,整了将近两个小时才找出来问题所在,先上图,看一下这种情况的出现环境:
上图是一个TabActivity,嵌入了四个子Activity,在上图中看到的那个Activity中有一个文本框,输入关键字可以进行查询。问题是输入文字后竟然不能修改、删除!
然后是各种调试,近两个小时,整得人快崩溃了,好在最终还是发现了问题所在。真相是这样滴————
我在上图的TabActivity中添加了一个按下返回键提醒是否退出的监听事件,使用的是booleandispatchKeyEvent(KeyEvent event),具体请参看《在TabActivity如何添加按键响应》。之前写的dispatchKeyEvent方法内容大致如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
@Override
publicbooleandispatchKeyEvent(KeyEvent event){
//按下返回键,弹出提示确认退出提示框
if(event.getAction()==KeyEvent.ACTION_DOWN
&&event.getKeyCode()==KeyEvent.KEYCODE_BACK){
AlertDialog.Builder builder=newAlertDialog.Builder(MainActivity.this);
builder.setMessage("您确定退出吗?")
.setTitle("友情提示")
.setNegativeButton("取消",
newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterface arg0,
intarg1){
arg0.cancel();
}
})
.setPositiveButton("确定",
newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterface dialog,intid){
finish();
}
});
AlertDialog alert=builder.create();
alert.show();
}
returntrue;
}
|
请注意我的返回值,我直接就return true了。这要是常用的onKeyDown()方法是没有问题的,但是dispatchKeyEvent略有不同,请看官方的解释:
Called to process key events. You can override this to intercept all key events before they are dispatched to the window. Be sure to call this implementation for key events that should be handled normally.
dispatchKeyEvent会截获所有的按键事件,如果直接return而不调用super.dispatchKeyEvent(event),那么按键事件将被截断,而不执行系统默认的处理。知道了这一点,改起来就很快了,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
@Override
publicbooleandispatchKeyEvent(KeyEvent event){
//按下返回键,弹出提示确认退出提示框
if(event.getAction()==KeyEvent.ACTION_DOWN
&&event.getKeyCode()==KeyEvent.KEYCODE_BACK){
AlertDialog.Builder builder=newAlertDialog.Builder(MainActivity.this);
builder.setMessage("您确定退出吗?")
.setTitle("友情提示")
.setNegativeButton("取消",
newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterface arg0,
intarg1){
arg0.cancel();
}
})
.setPositiveButton("确定",
newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterface dialog,intid){
finish();
}
});
AlertDialog alert=builder.create();
alert.show();
/** 截获 返回键 按下事件,不让系统进行默认操作 */
returntrue;
}
/** 按下其它键,调用父类方法,进行默认操作 */
returnsuper.dispatchKeyEvent(event);
}
|