将没有富文本格式的文件粘贴到EditText中

Eri*_*rik 16 android rtf richtext android-edittext

如果我将Chrome for Android中的文本复制/粘贴到我的EditText视图中,它会变得混乱,显然是由于富文本格式化.

字体大小完全混乱,而不是那么大http://erikmi.tk/WaeG/image.png

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

更新: 所以我意识到,它editText.getText()给了我一个SpannableString包含一些格式.我可以通过召唤来摆脱.clearSpans();它.但我不能做那样的事情,editText.addTextChangedListener(new TextWatcher() { … }因为它变得非常缓慢,只有当我离开editText视图时UI才会更新.

Eri*_*rik 8

问题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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `editText.getText().length()`哦,这不好看!试试`s.length()`. (2认同)

dra*_*eet 7

一个完美的和简单的方法:覆盖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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和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);
    }
}
Run Code Online (Sandbox Code Playgroud)