单击EditText外部后如何在android上隐藏软键盘?

新手上路,请多包涵

好的,每个人都知道要隐藏键盘,您需要实现:

 InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

但这里最重要的是当用户触摸或选择任何其他不是 EditText 或软键盘的地方时,如何隐藏键盘?

我尝试在我的父母 onTouchEvent() 上使用 Activity 但这只有在用户触摸任何其他视图之外并且没有滚动视图时才有效。

我试图实现一个触摸、点击、聚焦监听器,但没有成功。

我什至尝试实现自己的滚动视图来拦截触摸事件,但我只能获取事件的坐标而不是单击的视图。

有没有标准的方法来做到这一点?在 iPhone 中,这真的很容易。

原文由 htafoya 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 459
2 个回答

以下代码段只是隐藏了键盘:

 public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager =
        (InputMethodManager) activity.getSystemService(
            Activity.INPUT_METHOD_SERVICE);
    if(inputMethodManager.isAcceptingText()){
        inputMethodManager.hideSoftInputFromWindow(
                activity.getCurrentFocus().getWindowToken(),
                0
        );
    }
}

您可以将其放在实用程序类中,或者如果您在活动中定义它,请避免使用活动参数,或调用 hideSoftKeyboard(this)

最棘手的部分是何时调用它。您可以编写一个方法,在您的活动中遍历每个 View ,并检查它是否是 instanceof EditText 如果它没有注册一个 setOnTouchListener 一切都会到位。如果您想知道如何做到这一点,它实际上非常简单。这就是你要做的,你写一个像下面这样的递归方法,实际上你可以用它来做任何事情,比如设置自定义字体等……这是方法

public void setupUI(View view) {

    // Set up touch listener for non-text box views to hide keyboard.
    if (!(view instanceof EditText)) {
        view.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                hideSoftKeyboard(MyActivity.this);
                return false;
            }
        });
    }

    //If a layout container, iterate over children and seed recursion.
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            View innerView = ((ViewGroup) view).getChildAt(i);
            setupUI(innerView);
        }
    }
}

就是这样,只需在 setContentView 在您的活动中调用此方法即可。如果您想知道要传递什么参数,它是父容器的 id 。将 id 分配给您的父容器,例如

<RelativeLayoutPanel android:id="@+id/parent"> ... </RelativeLayout>

并调用 setupUI(findViewById(R.id.parent)) ,仅此而已。

如果您想有效地使用它,您可以创建一个扩展的--- setupUI() Activity 并将此方法放入,并使您应用程序中的所有其他活动都扩展此活动并在 onCreate() 方法。

希望能帮助到你。

如果您使用超过 1 个活动,请为父布局定义公共 id,例如 <RelativeLayout android:id="@+id/main_parent"> ... </RelativeLayout>

Then extend a class from Activity and define setupUI(findViewById(R.id.main_parent)) Within its OnResume() and extend this class instead of ``Activity in your program


这是上述函数的 Kotlin 版本:

 @file:JvmName("KeyboardUtils")

fun Activity.hideSoftKeyboard() {
    currentFocus?.let {
        val inputMethodManager = ContextCompat.getSystemService(this, InputMethodManager::class.java)!!
        inputMethodManager.hideSoftInputFromWindow(it.windowToken, 0)
    }
}

原文由 Navneeth G 发布,翻译遵循 CC BY-SA 4.0 许可协议

我有这个问题的简单解决方案:

 InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);

原文由 Farzaneh Hoseini 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题