网上有好多种方法可实现,也比较零散, 此处做个小结,希望有所帮助。
1、在xml直接添加属性
android:textIsSelectable="true"
这样直接实现自带效果
2、通过继承EditText,自定义TextView
public class NewTextView extends EditText {
public NewTextView(Context context) {
super(context);
// TODO Auto-generated constructor stub }
public NewTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub }
public NewTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub }
@Override
protected boolean getDefaultEditable() {//禁止EditText被编辑 return false;
}
}
上面很关键的一个方法是getDefaultEditable(), return false;即禁止EditText被编辑,变成了不可编辑的EditText,但同时具有EditText的长按复制功能。更进一步的,如果查看EditText源码, 就发现源码中有一个方法 protected void onCreateContextMenu(ContextMenu menu)
控制了EditText长按弹出的上下文菜单,可以自定义这个方法且实现为空protected void onCreateContextMenu(ContextMenu menu){ }
然后在onTouchEvent事件中拦截处理自定义的点按事件,弹出自定义的菜单。
原理如上, 更直白简单的方法是直接在xml中使用一个EditText,并且将属性设置为 android:editable=”false” .
3、使用OnLongClickListener
直接使用TextView,然后在代码里给TextView添加OnLongClickListener事件,长按时弹出自定义 “复制” 菜单(比如结合 PopupWindow做弹出菜单)。点击”复制” 就去获取TextView的内容。
当然, 这里只是获取内容,如何将内容放入粘贴管理器还需要一个ClipboardManager 对象。它负责管理复制后粘贴的这件事。
ClipboardManager cmb = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
cmb.setText(content.trim()); //将内容放入粘贴管理器,在别的地方长按选择"粘贴"即可 cm.getText();//获取粘贴信息
4、使用setTextIsSelectable()方法
代码中直接对TextView使用setTextIsSelectable()方法,将TextView设置成可点按选择的即可。
TextView tv = new TextView(context);
tv.setTextIsSelectable(true);