Вставить без форматирования форматированного текста в EditText

Если я скопирую / вставляю текст из Chrome для Android в свой вид EditText, он перепутался, видимо, из-за форматирования форматированного текста.

Размер шрифта полностью перепутан, а не тот большой http://erikmi.tk/WaeG/image.png

Есть ли способ показать EditText, чтобы игнорировать форматирование форматированного текста? Или я могу поймать событие вставки и удалить его, прежде чем он будет установлен? Как мне это сделать?

UPDATE: Итак, я понял, что editText.getText() дает мне SpannableString который содержит некоторое форматирование. Я могу избавиться от этого, вызвав .clearSpans(); в теме. НО я не могу сделать ничего подобного в editText.addTextChangedListener(new TextWatcher() { … } потому что он становится чересчур медленным, и пользовательский интерфейс обновляется только после того, как я покинул представление editText.

Solutions Collecting From Web of "Вставить без форматирования форматированного текста в EditText"

Проблема с clearSpans() заключалась в том, что он слишком сильно удалился, и editText ведет себя странно после этого. Следуя подходу в этом ответе, я 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]); } } 

Совершенный и простой способ: переопределить onTextContextMenuItem и перехватить android.R.id.paste чтобы быть android.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); } }