禁止EditText 輸入粘貼版內容

   有時候需要在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



發佈了35 篇原創文章 · 獲贊 12 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章