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

好的,大家都知道要隐藏你需要实现的键盘:

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

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

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

我试图实现一个触摸,点击,焦点侦听器没有任何成功。

我甚至试图实现我自己的滚动视图来拦截触摸事件,但我只能得到事件的坐标而不是点击的视图。

有没有一个标准的方法来做到这一点? 在iPhone中它非常简单。


以下片段只是隐藏键盘:

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

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

最棘手的部分是何时调用它。 您可以编写一个方法,遍历活动中的每个View ,并检查它是否为instanceof EditText一个instanceof EditText如果它未setOnTouchListener组件注册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)) ,就是这样。

如果你想有效地使用它,你可以创建一个扩展的Activity并放入这个方法,并让你的应用程序中的所有其他活动扩展这个活动并在onCreate()方法中调用它的setupUI()

希望能帮助到你。

如果你使用多于一个活动,定义普通的id给像<RelativeLayout android:id="@+id/main_parent"> ... </RelativeLayout>

然后从Activity扩展一个类并在其OnResume()定义setupUI(findViewById(R.id.main_parent)) OnResume()并扩展这个类,而不是in your program “Activity”


您可以通过执行以下步骤来实现此目的:

  • 通过添加以下属性使父视图(活动的内容视图)可点击并可聚焦

        android:clickable="true" 
        android:focusableInTouchMode="true" 
    
  • 实现一个hideKeyboard()方法

        public void hideKeyboard(View view) {
            InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    
  • 最后,设置edittext的onFocusChangeListener。

        edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    hideKeyboard(v);
                }
            }
        });
    
  • 正如下面其中一条评论所指出的,如果父视图是ScrollView,这可能不起作用。 对于这种情况,可点击和focusableInTouchMode可以直接在ScrollView下添加到视图中。


    我发现接受的答案有点复杂。

    这是我的解决方案。 将OnTouchListener添加到主布局,即:

    findViewById(R.id.mainLayout).setOnTouchListener(this)
    

    并将以下代码放入onTouch方法中。

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

    这样你就不必遍历所有视图。

    链接地址: http://www.djcxy.com/p/16667.html

    上一篇: How to hide soft keyboard on android after clicking outside EditText?

    下一篇: How to check visibility of software keyboard in Android?