好久没更博、之前一段时间新模块开发、、太忙太忙、
今天写的是刚新增的需求,用户要求可以复制一些不可编辑的EditText里面的内容,这个问题网上有几种解决办法,一个是自定义控件中重写getDefaultEditable()方法,我用的也是自定义控件,所以先试了这种方法,但是长按并没有实现想要的功能,另外有一种方法是通过setTextIsSelectable(true)来实现,我也试过了,再次失败。。。。思来想去也不知道为什么失败,于是决定利用手势(ge's'true)实现。
首先自定义控件继承EditText,然后实现OnGestureListener接口,然后定义一个手势识别器(gesturedetector),在每一个构造方法中都实例化它:
public IEditText(Context context, AttributeSet attrs) {
super(context, attrs);
gesture = new GestureDetector(getContext(), IEditText.this);
}
public IEditText(Context context) {
super(context);
gesture = new GestureDetector(getContext(), IEditText.this);
}
public IEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
gesture = new GestureDetector(getContext(), IEditText.this);
}
然后重写EditText的onTouchEvent方法,
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
gesture.onTouchEvent(event);
return super.onTouchEvent(event);
}
我们不在这里处理Ontouch事件,而是把它交给gesturedetector处理,也就是gesture.onTouchEvent(event);这条语句。接下来按需要重写gestureListener的Ondown、OnShowPress、OnSingleTapup、Onscroll、onLongPress、Onfling方法,不知道这些方法代表什么意思请搜索android基础手势检测,在这里不啰嗦了。因为我要实现长按复制,所以贴上OnLongPress代码:
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
if(!IEditText.this.isEnabled()){
ClipboardManager cmb = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("simple text", this.getText());
cmb.setPrimaryClip(clip);
Toast.makeText(getContext(), "复制成功", Toast.LENGTH_LONG).show();
}
}
这样就可以实现长按复制不可编辑的EditText里面的内容,大家看到这里可能会觉得这样处理长按事件有点太简陋,至少也得弹个菜单框把? 对!我也是这样想的!于是我做了一个popupwindow,做完之后经理说不要那么麻烦,直接简单实现复制就可以了、、、、、、、、(一万只草泥马奔腾)所以去掉了弹窗,有兴趣的朋友可以根据情况用不同的方法优化一下用户体验。
这次就到这里,献丑啦。