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

时间:2014-07-15 12:52:27

标签: android android-edittext rtf richtext

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

The font size is totally messed up and not that big http://erikmi.tk/WaeG/image.png

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

更新 所以我意识到editText.getText()给了我一个包含一些格式的SpannableString。我可以通过调用.clearSpans();来解决这个问题。但是我不能在editText.addTextChangedListener(new TextWatcher() { … }中做任何类似的事情,因为它变得非常慢,而且只有在我离开editText视图时UI才会更新。

4 个答案:

答案 0 :(得分:7)

clearSpans()的问题是它删除了太多而且editText此后表现得很奇怪。按照this answer中的方法,我只删除了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]);
    }
}

答案 1 :(得分:6)

一种完美而简单的方法:覆盖EditText的{​​{1}}并截取onTextContextMenuItemandroid.R.id.paste

android.R.id.pasteAsPlainText

copyToClipBoard:

@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);
            }
        }
    }
}

答案 2 :(得分:0)

这个简单的复制和粘贴应该为您提供没有格式化的文本:

public void paste(View v) {
    int sdk = android.os.Build.VERSION.SDK_INT;
    if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        editText.setText(clipboard.getText());
    } else {
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        android.content.ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);

        if (item.getText() != null) {
            editText.getText().insert(editText.getSelectionStart(), item.getText());
        }
    }
    editText.setSelection(0);
}

public void copy(View v) {
    if (editText.getText() != null) {
        String selectedText = editText.getText().toString();

        int start = editText.getSelectionStart();
        int end = editText.getSelectionEnd();

        if (end > start) {
            selectedText = selectedText.substring(start, end);

            int sdk = android.os.Build.VERSION.SDK_INT;
            if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
                android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                clipboard.setText(selectedText);
            } else {
                android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                android.content.ClipData clip = android.content.ClipData.newPlainText("WordKeeper", selectedText);
                clipboard.setPrimaryClip(clip);
            }
        } else
            Toast.makeText(this, "To copy, select some text first by pressing and and holding the text area.", Toast.LENGTH_SHORT).show();
    }
}

答案 3 :(得分:0)

上面的

Erik的答案删除了很少的格式化,但不是全部。因此,我使用了:

CharacterStyle [] toBeRemovedSpans = string.getSpans(0,string.length(),                                                 CharacterStyle.class); 删除所有格式。