Android平台使用回调机制来处理用户界面事件,每个View都有自己的处理事件的回调方法,如果事件没有被Activity的任何一个View所处理时,Android就会调用Activity的时间处理回调方法进行处理。
注意:如果在一个事件的方法体中,你认为已经完整地处理了这个事件,并不希望其他的回调方法,如Activity的回调方法再次处理,就返回true,否则返回false
有的时候,Android自带的视图组件并不能满足我们的需求,比如我们想要EditText实现这样的功能:它的内容不可以通过键盘输入,而只能通过程序来控制,Android自带的EditText是不具备这样的功能的,只要轻轻点击EditText用户就可以轻易输入内容了。所以我们必须开发自己的视图组件,以实现特定的需求,下面以上面提到的具有特殊功能的EditText为例,简单的讲解一下步骤。
首先,我们必须定义自己的EditText,继承自系统自带的EditText
public class
MyEditText extends EditText {
public
MyEditText(Context context, AttributeSet attrs) {
super(context,
attrs);
}
@Override
public boolean
onTouchEvent(MotionEvent event) {
return
true;//表示什么也不做
}
}
然后在布局文件中以包名加类名的方式加入自己定义的视图组件
<com.yuchao.myWidget.MyEditText
这样,该EditText在处理用户事件中就会调用我们覆盖EditText中相应的方法了。
其实,Android中还为每一个View提供了一种事件监听的接口,每个接口都需要实现一个回调方法,我们只要实现这些方法,就能对事件进行处理,典型的例子是按钮的onClickListener,不再赘述!
下面代码展示向EditText中添加表情,类似QQ聊天窗口
findViewById(R.id.btn_insert ).setOnClickListener(new
OnClickListener() {
try{
Bitmap bitmap =
BitmapFactory.decodeResource(getResources(),
R.drawable.hh);
//
根据Bitmap对象创建ImageSpan对象
ImageSpan imageSpan = new ImageSpan(bitmap);
//
创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像
SpannableString spannableString = new
SpannableString("f");
//
用ImageSpan对象替换"f"占位符
spannableString.setSpan(imageSpan, 0, 1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//
将获得的图像追加到EditText控件的最后
EditText
editText=(EditText)findViewById(R.id.neveredit);
editText.append(spannableString);
}catch(Exception e){}
}
});