Android - 在Android 8上隐藏键盘

时间:2018-03-19 21:49:46

标签: android kotlin

我在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只是忽略它并且无论如何都会显示键盘。 可能使输入字段不可聚焦会有所帮助,但我真的需要它可以集中精力,所以这不是一个选项。

9 个答案:

答案 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)
            }
        }

使用示例:

  1. UIHelper.hideSoftKeyboard(this)
  2. UIHelper.hideSoftKeyboard(passwordField)
  3. 显示:

        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.
    }
}