我在Android 8上隐藏键盘时遇到了麻烦。 我之前使用过它,它适用于较旧的机器人:
val view = activity.currentFocus
if (view != null) {
val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
}
Android 8只是忽略它并且无论如何都会显示键盘。 可能使输入字段不可聚焦会有所帮助,但我真的需要它可以集中精力,所以这不是一个选项。
答案 0 :(得分:5)
而不是hideSoftInputFromWindow
,您可以使用toggleSoftInput
。
val imm: InputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
if (imm.isActive)
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
至少适用于模拟器上的Android 8
答案 1 :(得分:2)
@EarlOfEgo的解决方案在较旧的Android版本上造成了一些麻烦。这是理想的解决方案,适用于所有(至少几乎)Android版本:
protected fun hideKeyboard() {
val view = activity.currentFocus
if(android.os.Build.VERSION.SDK_INT >= 26) {
val imm: InputMethodManager = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
view?.post({
imm.hideSoftInputFromWindow(activity.currentFocus.windowToken, 0)
imm.hideSoftInputFromInputMethod(activity.currentFocus.windowToken, 0)
})
} else {
if (view != null) {
val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
imm.hideSoftInputFromInputMethod(view.windowToken, 0)
}
}
}
答案 2 :(得分:1)
在Manifest
标记内的Activity
中尝试此行:
<activity
android:name=".Activity"
android:windowSoftInputMode="stateHidden"/>
答案 3 :(得分:1)
这里有两个隐藏键盘的静态功能,取决于你想要使用的是哪种情况。我在Android Oreo上进行了测试,但它确实有效。
object UIHelper {
fun hideSoftKeyboard(activity: Activity?) {
if (activity != null) {
val inputManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
if (activity.currentFocus != null && inputManager != null) {
inputManager.hideSoftInputFromWindow(activity.currentFocus!!.windowToken, 0)
inputManager.hideSoftInputFromInputMethod(activity.currentFocus!!.windowToken, 0)
}
}
}
fun hideSoftKeyboard(view: View?) {
if (view != null) {
val inputManager = view!!.getContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager?.hideSoftInputFromWindow(view!!.getWindowToken(), 0)
}
}
fun showKeyboard(activityContext: Context, editText: EditText) {
editText.requestFocus()
Handler().postDelayed(Runnable {
val inputMethodManager = activityContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT)
}, 250)
}
}
使用示例:
UIHelper.hideSoftKeyboard(this)
UIHelper.hideSoftKeyboard(passwordField)
显示:
UIHelper.showKeyboard(this, passwordField)
答案 4 :(得分:0)
我最近遇到了同样的问题,并通过提供(在我的情况下)窗口令牌的片段而不是活动的当前焦点的根视图来解决它。
这样,键盘被解除,并保持EditText
的焦点。
在运行Android 8.1
的Pixel 2 XL上测试:
/**
* Hides the Soft Keyboard on demand
*
* @param activity the activity from which to get the IMM
* @param view the view from which to provide a windowToken
*/
fun hideSoftKeyboard(activity: Activity, view: View?) {
val inputMethodManager = activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view?.windowToken, 0)
}
答案 5 :(得分:0)
我有类似的问题,我解决了这个问题:
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
window.setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
}
}
这不是最优雅的解决方案。但在我的情况下,这是可以接受的
答案 6 :(得分:0)
使用我创建的方法
public static void showHideInput(Context context,boolean visibility, View view){
if (view != null) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
if (visibility) imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
else imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
答案 7 :(得分:0)
使用您的视图的调用post方法隐藏可运行的键盘:
view.post(() -> {
hideKeyboard(view);
}
答案 8 :(得分:0)
只需尝试使用此方法来拦截焦点事件并隐藏软键盘:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
View lFocused = getCurrentFocus();
if (lFocused != null)
lFocused.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager lInputManager = (InputMethodManager) pContext.getSystemService(Context.INPUT_METHOD_SERVICE);
lInputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}, 100);//Modified to 100ms to intercept SoftKeyBoard on Android 8 (Oreo) and hide it.
}
}