有時候需要在edittext中禁止輸入粘貼內容,防止論壇灌水、輸入大量重複信息等,這就要監聽複製粘貼等操作:
重寫EditText的
public boolean onTextContextMenuItem(int id) {
return super.onTextContextMenuItem(id);
}
方法,根據id判斷當前操作:
id:16908319
全選
id:16908328
選擇
id:16908320
剪貼
id:16908321
複製
id:16908322
粘貼
id:16908324
輸入法
自定義EditText, 然後重寫onTextContextMenuItem方法,在這裏面查看id就知道對應的操作了
public class MyEditText extends EditText {
public MyEditText(Context context) {
super(context);
}
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTextContextMenuItem(int id) {
System.out.println("id:" + id);
return super.onTextContextMenuItem(id);
}
}
也可以改變它的粘貼內容:
先看看TextView(EditText extends TextView)源碼中對於複製黏貼的實現過程:
public boolean onTextContextMenuItem(int id) {
int min = 0;
int max = mText.length();
if (isFocused()) {
final int selStart = getSelectionStart();
final int selEnd = getSelectionEnd();
min = Math.max(0, Math.min(selStart, selEnd));
max = Math.max(0, Math.max(selStart, selEnd));
}
ClipboardManager clip = (ClipboardManager)getContext()
.getSystemService(Context.CLIPBOARD_SERVICE);
switch (id) {
......
case ID_CUT: //裁剪
clip.setText(mTransformed.subSequence(min, max));
((Editable) mText).delete(min, max);
stopTextSelectionMode();
return true;
case ID_COPY: //複製
clip.setText(mTransformed.subSequence(min, max));
stopTextSelectionMode();
return true;
case ID_PASTE://粘貼
CharSequence paste = clip.getText();//得到粘貼版內容
if (paste != null && paste.length() > 0) {
long minMax = prepareSpacesAroundPaste(min, max, paste);
min = extractRangeStartFromLong(minMax);
max = extractRangeEndFromLong(minMax);
Selection.setSelection((Spannable) mText, max);
((Editable) mText).replace(min, max, paste);
stopTextSelectionMode();
}
return true;
......
}
return false;
}
實現思路:
只要我們重設粘貼板的內容就可以,我們需要自定義EditText,重寫它的粘貼板內容
這個是給粘貼文本添加內容,比如前綴。也可以做其他設置,或用正則表達式替換,過濾等。
public class MyEditText extends EditText {
private static final int ID_PASTE = android.R.id.paste;
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTextContextMenuItem(int id) {
if(id == ID_PASTE){
ClipboardManager clip = (ClipboardManager)getContext().getSystemService(Context.CLIPBOARD_SERVICE);
clip.setText("增加的內容==>"+clip.getText());
}
return super.onTextContextMenuItem(id);
}
}
佈局文件中:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.customeredittexttest.MyEditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="50dip"
android:layout_alignParentTop="true"
/>
</RelativeLayout>[/
效果圖:
demo源碼地址:
EditText監聽粘貼內容
http://download.csdn.net/detail/xiaobijia/8154695