不使用富文本格式粘贴到EditText中

如果我从Android的Chrome浏览器复制/粘贴文本到我的EditText视图中,显然是由于丰富的文本格式造成的。

字体大小是完全搞砸了,不是那么大http://img.androidcookie.com/android/image.png

有没有办法告诉EditText视图忽略富文本格式? 或者我可以捕获粘贴事件,并将其删除之前,它被设置? 我该怎么做?

更新:所以我意识到editText.getText()给了我一个包含一些格式的SpannableString 。 我可以通过调用.clearSpans(); 在上面。 但是我不能在editText.addTextChangedListener(new TextWatcher() { … }做任何事情,因为它非常慢,只有当我离开editText视图时UI才会更新。

Solutions Collecting From Web of "不使用富文本格式粘贴到EditText中"

clearSpans()的问题在于它删除了太多,editText之后performance怪异。 通过遵循这个答案的方法,我只删除MetricAffectingSpan ,它工作正常。

 public void afterTextChanged(Editable string) { CharacterStyle[] toBeRemovedSpans = string.getSpans(0, string.length(), MetricAffectingSpan.class); for (int index = 0; index < toBeRemovedSpans; index++) string.removeSpan(toBeRemovedSpans[index]); } } 

一个完美和简单的方法:覆盖EditTextonTextContextMenuItem并拦截android.R.id.pasteandroid.R.id.pasteAsPlainText

 @Override public boolean onTextContextMenuItem(int id) { if (id == android.R.id.paste) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { id = android.R.id.pasteAsPlainText; } else { onInterceptClipDataToPlainText(); } } return super.onTextContextMenuItem(id); } private void onInterceptClipDataToPlainText() { ClipboardManager clipboard = (ClipboardManager) getContext() .getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = clipboard.getPrimaryClip(); if (clip != null) { for (int i = 0; i < clip.getItemCount(); i++) { final CharSequence paste; // Get an item as text and remove all spans by toString(). final CharSequence text = clip.getItemAt(i).coerceToText(getContext()); paste = (text instanceof Spanned) ? text.toString() : text; if (paste != null) { ClipBoards.copyToClipBoard(getContext(), paste); } } } } 

和copyToClipBoard:

 public class ClipBoards { public static void copyToClipBoard(@NonNull Context context, @NonNull CharSequence text) { ClipData clipData = ClipData.newPlainText("rebase_copy", text); ClipboardManager manager = (ClipboardManager) context .getSystemService(Context.CLIPBOARD_SERVICE); manager.setPrimaryClip(clipData); } }