显示没有EditText的软键盘

18

我的目标是在某些事件中显示/隐藏屏幕软件键盘并拦截该键盘的输入。

我发现软键盘可以为一些View类的后代显示,但我不需要在屏幕上显示任何文本编辑小部件的可视表示,只需要能够编程方式显示/隐藏软键盘并进行输入拦截。

如何才能最好地实现这一点?

5个回答

22

即使这个问题已经问了将近一年,但是它没有被接受并且完全有用的答案,因为我自己遇到了相同的问题,所以我想分享我的解决方案:

正如Vikram所指出的那样,这是显示软输入法的方法:

InputMethodManager im = (InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
im.showSoftInput(myView, InputMethodManager.SHOW_FORCED);

但是,您还必须将视图设置为可聚焦并在触摸模式下可聚焦:

myView.setFocusable(true);
myView.setFocusableInTouchMode(true);

或在您的视图中XML:

android:focusable = "true"
android:focusableInTouchMode = "true"

你如何拦截键盘输入? - bgolson
2
你需要更具体一些。以何种方式拦截?你可以重写View.onKeyDown(int keyCode, KeyEvent event)方法。这是你的意思吗? - britzl
1
谢谢!但是我需要在showSoftInput(...)之前加上myView.requestFocus()才能让它对我起作用。 - JohnnyAW
“setFocusableInTouchMode()”就是我所缺少的!这个调用足以解决问题(还确保视图可聚焦)。但出于某种原因,如果在XML中设置,它对我不起作用:( - Marcel Bro

5
您可以使用以下方法强制显示软键盘:

在代码中添加以下语句即可:

InputMethodManager im = (InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
im.showSoftInput(myView, InputMethodManager.SHOW_FORCED);

并且要隐藏:

((InputMethodManager) YourActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(findViewById(R.id.YOUR_VIEW).getWindowToken(), 0);

这个方法不起作用。showSoftInput返回false,键盘没有显示。 - Nekuromento
它应该可以工作,但你可以尝试以下代码: im.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT); - Vikram

3
实际上,您可以通过清单文件始终显示软键盘输入。将以下行添加到要显示软键盘的每个活动中:
android:windowSoftInputMode="stateAlwaysVisible"

无论视图中是否有edittext,软键盘都会显示出来。

<activity android:name=".ChatActivity"
    android:windowSoftInputMode="stateAlwaysVisible">

</activity>

2

但是如何获取用户输入的内容呢?

您可以使用EditText作为您的view参数,但您不必向用户展示它。相反,为您的editText视图创建一个父视图(例如LinearLayout),并将父视图的setVisibility设置为gone。此外,您可以通过使用EditText.addTextChangedListener来不断获取输入。

 <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="gone">
<EditText
    android:layout_width="100dp"
    android:layout_height="20dp"
    android:focusable = "true"
    android:focusableInTouchMode = "true"
    android:id="@+id/edt"/>
</LinearLayout>

1

我不得不结合之前的多个答案才能使其工作

在活动文件中,我添加了这段代码:

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="gone"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <EditText
        android:id="@+id/edt"
        android:layout_width="100dp"
        android:layout_height="20dp"
        android:focusable="true"
        android:focusableInTouchMode="true" />
</LinearLayout>

假设我想在点击按钮时弹出键盘,我在活动(Kotlin)文件中添加了以下代码段:
binding.button.setOnClickListener {
        binding.edt.requestFocus()
        val im: InputMethodManager =
            (this@MainActivity).getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
        im.showSoftInput(binding.edt, InputMethodManager.SHOW_FORCED)
    }

只有在我添加了这一行代码后它才正常工作:binding.edt.requestFocus()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接