用过EditText的都知道,EditText有个特点,当在里面长按的时候,会出现一个ContextMenu,提供了选择文字,复制,剪切等功能。有时候,我们会想,如果不出现这个ContextMenu,直接就在view上选择文字,那多美好啊。相信很多人抱有这样的想法,很不幸,我也是。于是我就研究了一下EditText和TextView的代码,然后将这个问题解决了。
- @Override
- public
boolean getDefaultEditable() { -
return false; - }
- @Override
- protected
MovementMethod getDefaultMovementMethod () { -
return null; - }
- import
android.content.Context; - import
android.graphics.Color; - import
android.text.Layout; - import
android.text.Selection; - import
android.view.ContextMenu; - import
android.view.Gravity; - import
android.view.MotionEvent; - import
android.widget.EditText; -
-
- public
class TextPage extends EditText { -
private int off; //字符串的偏移值 -
-
public TextPage(Context context) { -
super(context); -
initialize(); -
} -
-
private void initialize() { -
setGravity(Gravity.TOP); -
setBackgroundColor(Color.WHITE); -
} -
-
@Override -
protected void onCreateContextMenu(ContextMenu menu) { -
//不做任何处理,为了阻止长按的时候弹出上下文菜单 -
} -
-
@Override -
public boolean getDefaultEditable() { -
return false; -
} -
-
@Override -
public boolean onTouchEvent(MotionEvent event) { -
int action = event.getAction(); -
Layout layout = getLayout(); -
int line = 0; -
switch(action) { -
case MotionEvent.ACTION_DOWN: -
line = layout.getLineForVertical(getScrollY()+ (int)event.getY()); -
off = layout.getOffsetForHorizontal(line, (int)event.getX()); -
Selection.setSelection(getEditableText(), off); -
break; -
case MotionEvent.ACTION_MOVE: -
case MotionEvent.ACTION_UP: -
line = layout.getLineForVertical(getScrollY()+(int)event.getY()); -
int curOff = layout.getOffsetForHorizontal(line, (int)event.getX()); -
Selection.setSelection(getEditableText(), off, curOff); -
break; -
} -
return true; -
} - }