我的目标是在某些事件中显示/隐藏屏幕软件键盘并拦截该键盘的输入。
我发现软键盘可以为一些View
类的后代显示,但我不需要在屏幕上显示任何文本编辑小部件的可视表示,只需要能够编程方式显示/隐藏软键盘并进行输入拦截。
如何才能最好地实现这一点?
我的目标是在某些事件中显示/隐藏屏幕软件键盘并拦截该键盘的输入。
我发现软键盘可以为一些View
类的后代显示,但我不需要在屏幕上显示任何文本编辑小部件的可视表示,只需要能够编程方式显示/隐藏软键盘并进行输入拦截。
如何才能最好地实现这一点?
即使这个问题已经问了将近一年,但是它没有被接受并且完全有用的答案,因为我自己遇到了相同的问题,所以我想分享我的解决方案:
正如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"
在代码中添加以下语句即可:
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);
android:windowSoftInputMode="stateAlwaysVisible"
无论视图中是否有edittext,软键盘都会显示出来。
<activity android:name=".ChatActivity"
android:windowSoftInputMode="stateAlwaysVisible">
</activity>
但是如何获取用户输入的内容呢?
您可以使用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>
我不得不结合之前的多个答案才能使其工作
在活动文件中,我添加了这段代码:
<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>
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()
showSoftInput(...)
之前加上myView.requestFocus()
才能让它对我起作用。 - JohnnyAW