在没有edittext的情况下在软键盘上捕获完成的动作?

时间:2019-06-05 14:10:34

标签: java android android-softkeyboard

在我的应用中,我有一个显示某些内容的Web视图。其中一个屏幕上有一个文本框可填写。我想捕获用户何时按下键盘上的完成按钮,但是也没有添加编辑器的文本来添加侦听器。无论设备和键盘如何,如何捕获动作?

我很幸运地尝试了这些。 EditText with textPassword inputType, but without Softkeyboard

android: Softkeyboard perform action when Done key is pressed

@Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_ENTER:
                // code here
                break;
            default:
                return super.onKeyUp(keyCode, event);
        }
        return true;
    }

我的类重写KeyEvent.Callback,但从未调用上述功能onKeyDown。

2 个答案:

答案 0 :(得分:2)

创建自定义Web视图,覆盖onCreateInputConnection以将ime选项和输入类型设置为键盘,覆盖dispatchKeyEvent以获得将其过滤掉的键事件

示例:

class MyWeb@JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0) : WebView(context, attrs, defStyleAttr) {

override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection {
    val inputConnection = BaseInputConnection(this, false)
    return inputConnection
}

override fun dispatchKeyEvent(event: KeyEvent): Boolean {
    super.dispatchKeyEvent(event)
    val dispatchFirst = super.dispatchKeyEvent(event)
    if (event.action == KeyEvent.ACTION_UP) {
        when (event.keyCode) {
            KeyEvent.KEYCODE_ENTER -> {
                Toast.makeText(context,"Hii",Toast.LENGTH_LONG).show()
                //callback?.onEnter()
            }
        }
    }
    return dispatchFirst
}

}

和XML

<com.example.MyWeb
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:id="@+id/web"
/>`

来源:https://medium.com/@elye.project/managing-keyboard-on-webview-d2e89109d106

答案 1 :(得分:1)

几乎从不从软键盘发送按键事件,它们使用更直接的方法。

Android键盘的工作方式是绑定到视图。该视图必须实现getInputConnection()返回一个对象,该对象将允许键盘应用程序(通过AIDL)调用函数。这些功能之一被称为“动作键”(完成按钮)。在默认的InputConnection实现中,它将调用注册到绑定视图的侦听器。

由于您要在此处处理网络视图-我认为没有办法直接捕获它。您可以尝试将WebView子类化为ActionKeyWebView。添加一个功能来注册操作键侦听器接口。  重写getInputConnection以返回您自己的InputConnectionWrapper子类,并包装super.getInputConnection()。重写performEditorAction可以调用为Webview注册的所有侦听器。它的代码很多,但应该可以。