Как получить последний текст, когда пользователь вставил его в текст редактирования - PullRequest
1 голос
/ 20 мая 2019

У меня есть текст редактирования, в котором много слов. После того, как я вставил несколько ключевых слов, я хочу поймать только вставленные ключевые слова.

Я нахожу другое решение, но это только дало мне текст вставлен или вырезан. Я тоже хочу ключевые слова.

Как обнаружить событие вставки в текстовом редакторе приложения?

Есть ли какое-нибудь решение, такое как swift или мы должны снова взломать.

И извините за мой ужасный английский.

«Тестовый тестовый тест» -> вставьте новый -> «Тестовый тест вставил здесь текст теста»

Я хочу получить «Вставленный текст здесь»

1 Ответ

2 голосов
/ 20 мая 2019

Вы должны создать собственный EditText, который может перехватить событие вставки. Для этого нужно будет переопределить onTextContextMenuItem(int id)

Что-то подобное достаточно:

public class MyEditText extends EditText {

    UpdateListener listener;

    public MyEditText(Context context) {
        super(context);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public MyEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    public void setUpdateListener(UpdateListener listener){
        this.listener = listener;
    }

    @Override
    public boolean onTextContextMenuItem(int id) {
        boolean consumed = super.onTextContextMenuItem(id);

        switch (id){
            case android.R.id.cut :
                if(listener != null) listener.onCut();
                break;
            case android.R.id.copy :
                if(listener != null) listener.onCopy();
                break;
            case android.R.id.paste :
                if(listener != null) listener.onPaste();
        }

        return consumed;
    }

    interface UpdateListener{
        void onCut();
        void onCopy();
        void onPaste();
    }
}

Затем в действии вы должны реализовать интерфейс, заданный этим пользовательским EditText

editText = findViewById(R.id.textview2);
editText.setUpdateListener(new MyEditText.UpdateListener() {
    @Override
    public void onCut() {
        Log.i(TAG, "onCut: ");
    }

    @Override
    public void onCopy() {
        Log.i(TAG, "onCopy: ");
    }

    @Override
    public void onPaste() {
        Log.i(TAG, "onPaste: ");
        // triggered when code is pasted
    }
});

Если я хорошо понимаю, вы хотите, чтобы когда пользователь вставлял что-то, он стирал написанное и вставлял текст. В onPaste():

@Override
public void onPaste() {
    Log.i(TAG, "onPaste: ");
    ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    String pasteData = "";
    //check if something present in clipboard, and check if it is text
    if (clipboard.hasPrimaryClip() && clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN)) {
        ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);
        pasteData = item.getText().toString();
        editText.setText(pasteData);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...