android 自定义view,如何监听输入法方向键粘贴复制剪切?

自定义 view 我在网上搜索好久资料,都没有监听输入法方向键 选择 粘贴 复制 剪切 例子方法。希望有人能够帮我解决一下,我现在这里感激不尽了。

img

想多了吧。

监听复制、剪切、粘贴事件方式有两种:

1 - 通过剪切板监听。

2 - 通过自定义EditText,重写onTextContextMenuItem() 方法实现监听。

监听复制、剪切事件的监听通过这两种方式都可以实现,而粘贴事件只能通过第二种方式实现。

两种方式的区别:

1.通过剪切板监听,其实是监听整个系统的复制、剪切操作。只要注册了事件监听,不管是App外的操作还是App内部的操作都可以监听到。而onTextContextMenuItem()方法是只针对某个EditText的。

2.剪切板只能监听复制、剪切事件,不能监听剪贴事件,因为Android没提供监听粘贴事件的API。而onTextContextMenuItem()既能监听到剪切复制事件,又能监听粘贴事件;

具体实现

剪切板的实现其实在官方文档中找到相应的内容。

/**

  • 注册剪切板复制、剪切事件监听

*/

private void registerClipEvents() {

mClipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

mOnPrimaryClipChangedListener = new ClipboardManager.OnPrimaryClipChangedListener() {

@Override

public void onPrimaryClipChanged() {

if (mClipboardManager.hasPrimaryClip()

&& mClipboardManager.getPrimaryClip().getItemCount() > 0) {

// 获取复制、剪切的文本内容

CharSequence content =

mClipboardManager.getPrimaryClip().getItemAt(0).getText();

Log.d("TAG", "复制、剪切的内容为:" + content);

}

}

};

mClipboardManager.addPrimaryClipChangedListener(mOnPrimaryClipChangedListener);

}

/**

* 注销监听,避免内存泄漏。

*/

@Override

protected void onDestroy() {

super.onDestroy();

if (mClipboardManager != null && mOnPrimaryClipChangedListener != null) {

mClipboardManager.removePrimaryClipChangedListener(mOnPrimaryClipChangedListener);

}

}

自定义EditText
在onTextContextMenuItem()方法中,我们可以监听到剪切、复制和粘贴事件。
我这里只监听了粘贴事件。如果有需要,可以自行拓展回调接口。

/**

* 可监听粘贴事件的EditText

*/

public class PasteEditText extends android.support.v7.widget.AppCompatEditText {

private OnPasteCallback mOnPasteCallback;

public interface OnPasteCallback {

void onPaste();

}

public PasteEditText(Context context) {

super(context);

}

public PasteEditText(Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

public boolean onTextContextMenuItem(int id) {

switch (id) {

case android.R.id.cut:

// 剪切

break;

case android.R.id.copy:

// 复制

break;

case android.R.id.paste:

// 粘贴

if (mOnPasteCallback != null) {

mOnPasteCallback.onPaste();

}

}

return super.onTextContextMenuItem(id);

}

public void setOnPasteCallback(OnPasteCallback onPasteCallback) {

mOnPasteCallback = onPasteCallback;

}

}

通过这种方法监听有点要注意,那就是你在回调中是获取不到复制、剪切、粘贴的文本内容的。想要获取到复制、剪切的文本还是需要通过监听剪切板去获取。

粘贴的内容的获取其实可以在Activity中添加个标记,在TextWatcher中判断此标记。这样可以间接的获取到粘贴内容。因为在onTextContextMenuItem(),自定义的回调先于super.onTextContextMenuItem(id)执行。这只加单写了EditText中内容为空的情况,如果有内容,那么自己去进行字符串的逻辑操作吧。

public class TestActivity extends AppCompatActivity {

// 是否点击了粘贴

private boolean isClickPaste;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

PasteEditText mEtInputLink = findViewById(R.id.et_input);

// 粘贴事件监听

mEtInputLink.setOnPasteCallback(new PasteEditText.OnPasteCallback() {

@Override

public void onPaste() {

isClickPaste = true;

}

});

mEtInputLink.addTextChangedListener(new TextWatcher() {

@Override

public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override

public void afterTextChanged(Editable s) {

if (isClickPaste) {

isClickPaste = false;

String content = mEtInputLink.getEditableText().toString();

//添加业务逻辑

}

}

});

}

}

在我们的项目开发中,有时会遇到这样的需求:当用户在输入框中进行了粘贴操作,直接就使用粘贴的内容进行服务端接口的请求,不需要用户再点击确认后才去进行接口请求。
对于这种情况,可以想到两种方式实现:
1.在复制或截切内容时,记录下复制剪切的内容,在EditText的TextWatcher中判断变更的文本是否与之前记录的内容一致,若一致则认为是进行了粘贴操作。
但是这种方式存在问题,那就是用户没有进行粘贴操作,而是输入。当输入的内容刚好与之前记录的内容一致时判断为了粘贴。这是不对的。
2.在对文本框进行粘贴操作是,获取粘贴的内容。
其实以上两种业务实现方式都涉及到了监听复制、剪切、粘贴事件。
监听复制、剪切、粘贴事件方式有两种:
1 - 通过剪切板监听。
2 - 通过自定义EditText,重写onTextContextMenuItem() 方法实现监听。
监听复制、剪切事件的监听通过这两种方式都可以实现,而粘贴事件只能通过第二种方式实现。
两种方式的区别:
1.通过剪切板监听,其实是监听整个系统的复制、剪切操作。只要注册了事件监听,不管是App外的操作还是App内部的操作都可以监听到。而onTextContextMenuItem()方法是只针对某个EditText的。
2.剪切板只能监听复制、剪切事件,不能监听剪贴事件,因为Android没提供监听粘贴事件的API。而onTextContextMenuItem()既能监听到剪切复制事件,又能监听粘贴事件;
具体实现
剪切板的实现其实在官方文档中找到相应的内容。
/**

  • 注册剪切板复制、剪切事件监听
  • /
    private void registerClipEvents() {
    mClipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
    mOnPrimaryClipChangedListener = new ClipboardManager.OnPrimaryClipChangedListener() {
    @Override
    public void onPrimaryClipChanged() {
    if (mClipboardManager.hasPrimaryClip()
    && mClipboardManager.getPrimaryClip().getItemCount() > 0) {
    // 获取复制、剪切的文本内容
    CharSequence content =
    mClipboardManager.getPrimaryClip().getItemAt(0).getText();
    Log.d("TAG", "复制、剪切的内容为:" + content);
    }
    }
    };
    mClipboardManager.addPrimaryClipChangedListener(mOnPrimaryClipChangedListener);
    }
    /**
  • 注销监听,避免内存泄漏。
  • /
    @Override
    protected void onDestroy() {
    super.onDestroy();
    if (mClipboardManager != null && mOnPrimaryClipChangedListener != null) {
    mClipboardManager.removePrimaryClipChangedListener(mOnPrimaryClipChangedListener);
    }
    }
    自定义EditText
    在onTextContextMenuItem()方法中,我们可以监听到剪切、复制和粘贴事件。
    我这里只监听了粘贴事件。如果有需要,可以自行拓展回调接口。
    /**
  • 可监听粘贴事件的EditText
  • /
    public class PasteEditText extends android.support.v7.widget.AppCompatEditText {
    private OnPasteCallback mOnPasteCallback;
    public interface OnPasteCallback {
    void onPaste();
    }
    public PasteEditText(Context context) {
    super(context);
    }
    public PasteEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    }
    @Override
    public boolean onTextContextMenuItem(int id) {
    switch (id) {
    case android.R.id.cut:
    // 剪切
    break;
    case android.R.id.copy:
    // 复制
    break;
    case android.R.id.paste:
    // 粘贴
    if (mOnPasteCallback != null) {
    mOnPasteCallback.onPaste();
    }
    }
    return super.onTextContextMenuItem(id);
    }
    public void setOnPasteCallback(OnPasteCallback onPasteCallback) {
    mOnPasteCallback = onPasteCallback;
    }
    }
    通过这种方法监听有点要注意,那就是你在回调中是获取不到复制、剪切、粘贴的文本内容的。想要获取到复制、剪切的文本还是需要通过监听剪切板去获取。
    粘贴的内容的获取其实可以在Activity中添加个标记,在TextWatcher中判断此标记。这样可以间接的获取到粘贴内容。因为在onTextContextMenuItem(),自定义的回调先于super.onTextContextMenuItem(id)执行。这只加单写了EditText中内容为空的情况,如果有内容,那么自己去进行字符串的逻辑操作吧。我这里就不写了。实测有效哦。
    public class TestActivity extends AppCompatActivity {
    // 是否点击了粘贴
    private boolean isClickPaste;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    PasteEditText mEtInputLink = findViewById(R.id.et_input);
    // 粘贴事件监听
    mEtInputLink.setOnPasteCallback(new PasteEditText.OnPasteCallback() {
    @Override
    public void onPaste() {
    isClickPaste = true;
    }
    });
    mEtInputLink.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }
    @Override
    public void afterTextChanged(Editable s) {
    if (isClickPaste) {
    isClickPaste = false;
    String content = mEtInputLink.getEditableText().toString();
    // 做些你爱做的事情
    }
    }
    });
    }
    }

我给你评论了,这个回答有限制,能通过吗?

https://ask.csdn.net/questions/238757?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-1-238757-ask-7775769.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-1-238757-ask-7775769.pc_feed_download_top3ask

在自定义view中重写

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    return super.dispatchKeyEvent(event);
}

img


event.getKeyCode()可以获取方向键,然后你可以重写方向键的action

输入法的方向键??监听方向键:

switch (event.getKeyCode()) {
           //左方向键
            case KeyEvent.KEYCODE_DPAD_LEFT:
                if (event.hasNoModifiers()) {
                    direction = View.FOCUS_LEFT;
                }
                break;
           //右方向键
            case KeyEvent.KEYCODE_DPAD_RIGHT:
                if (event.hasNoModifiers()) {
                    direction = View.FOCUS_RIGHT;
                }
                break;
            //上方向键
            case KeyEvent.KEYCODE_DPAD_UP:
                if (event.hasNoModifiers()) {
                    direction = View.FOCUS_UP;
                }
                break;
            //下方向键
            case KeyEvent.KEYCODE_DPAD_DOWN:
                if (event.hasNoModifiers()) {
                    direction = View.FOCUS_DOWN;
                }
                break;
            //TAB键
            case KeyEvent.KEYCODE_TAB:
                if (event.hasNoModifiers()) {
                    direction = View.FOCUS_FORWARD;
                } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
                    direction = View.FOCUS_BACKWARD;
                }
                break;
        }

editText.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                return false;
            }
        });

测试过了,这个能监听到方向键,但复制黏贴剪切这些监听不到

请注意哦,在7天内你没有收到满意答复,赶紧关闭,不然等系统自动给关了,结题了。嗯一分钱都不给你退。
我已经上当过了。