自定义TextView 可复制粘贴



import android.content.Context;
import android.text.method.MovementMethod;
import android.util.AttributeSet;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.widget.EditText;


public class MyTextView extends EditText {
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}


// 长按弹出文本选择框menu的关键方法:可以选择复制、剪切等等功能,视该textview的具体实现而定
// 如果希望不弹出这个menu界面,只要把这个方法返回空就ok
@Override
protected MovementMethod getDefaultMovementMethod() {
// TODO Auto-generated method stub
return super.getDefaultMovementMethod();
}


// 点击menu中的选定item的具体处理方法,捕捉点击文本复制、剪切等按钮的动作
// 如果要在点击复制按钮之后取消该textview的cursor可见性的具体监听写在这里
@Override
public boolean onTextContextMenuItem(int id) {
setCursorVisible(true);
boolean flag;
if (id != android.R.id.switchInputMethod) {
flag = super.onTextContextMenuItem(id);
} else {
setCursorVisible(false);
return false;
}
if (id == android.R.id.copy) {
setCursorVisible(false);
}
return flag;
}


@Override
protected void onCreateContextMenu(ContextMenu menu) {
super.onCreateContextMenu(menu);
if (isInputMethodTarget()) {
menu.removeItem(android.R.id.switchInputMethod);
}
}


// textview的点击捕捉
// 如果双击textview选中了具体文字,则使cursor可见
int cursorStart = -1;


@Override
public boolean onTouchEvent(MotionEvent event) {
boolean flag = super.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_DOWN && hasSelection()) {
if (cursorStart == -1) {// 由于点击选中文字后,再点击其他位置,第一次点击时显示的hasSelection依然为true,这样一来cursor会依然还在,为了避免这种情况,我这里多对selectionStart进行了一次验证
setCursorVisible(true);
cursorStart = getSelectionStart();
} else {
setCursorVisible(false);
cursorStart = -1;
}
}
return flag;
}


// 当按返回键取消文字复制时,使cursor再次不可见
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean flag = super.onKeyDown(keyCode, event);
if (!hasSelection()) {
setCursorVisible(false);
cursorStart = -1;
}
return flag;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值