单击android时隐藏默认键盘

Suj*_*jit 16 android

我想在屏幕中点击编辑框的一侧时隐藏软键盘.我怎样才能做到这一点?

小智 58

不得不编辑这个以使其工作.添加了一个检查以查看焦点视图是否为EditText.

@Override
public boolean dispatchTouchEvent(MotionEvent event) {

    View v = getCurrentFocus();
    boolean ret = super.dispatchTouchEvent(event);

    if (v instanceof EditText) {
        View w = getCurrentFocus();
        int scrcoords[] = new int[2];
        w.getLocationOnScreen(scrcoords);
        float x = event.getRawX() + w.getLeft() - scrcoords[0];
        float y = event.getRawY() + w.getTop() - scrcoords[1];

        Log.d("Activity", "Touch event "+event.getRawX()+","+event.getRawY()+" "+x+","+y+" rect "+w.getLeft()+","+w.getTop()+","+w.getRight()+","+w.getBottom()+" coords "+scrcoords[0]+","+scrcoords[1]);
        if (event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom()) ) { 

            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
        }
    }
return ret;
}
Run Code Online (Sandbox Code Playgroud)

可能会以更顺畅的方式完成,但它的效果非常好.

  • 要添加一些说明 - 如果您想要在用户单击任何外部的EDITEXT时关闭键盘,而不是仅仅在另一个按钮的onClick()中,那么Daniel的代码将完美运行.只需将方法添加/覆盖到您的Activity,用户就可以通过单击EditText外部的任何位置来关闭键盘(也适用于单个屏幕上的多个EditTexts).谢谢Daniel! (2认同)
  • 这不是一个完美的答案,因为它会隐藏键盘,而不是点击.如果您例如滚动一下,键盘将被隐藏.这通常不是必需的. (2认同)

Nic*_*ely 32

要强制隐藏键盘,您可以使用以下代码...我将它放在一个名为'hideSoftKeyboard()'的方法中.正如Falmarri所提到的,当你点击它时,软键盘应该隐藏起来.但是,如果您在另一个项目的"onClick()"中调用此方法,它将强制关闭键盘.

private void hideSoftKeyboard(){
    if(getCurrentFocus()!=null && getCurrentFocus() instanceof EditText){
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(yourEditTextHere.getWindowToken(), 0);
    }
}
Run Code Online (Sandbox Code Playgroud)


Vir*_*hme 7

这可以使用以下代码完成:

1)使用findViewById()将您的父布局引用到java代码中.

2)然后将setOnTouchListener()应用于它.

3)在onTouchMethod()中添加以下代码.

 lin = (LinearLayout) findViewById(R.id.lin);
    lin.setOnTouchListener(new OnTouchListener() 
    {
        @Override
        public boolean onTouch(View v, MotionEvent event) 
        {
               InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                               imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
                       return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)


Rob*_*ond 6

我在活动中添加了以下内容.它的工作原理是因为在可聚焦视图外触摸不会改变焦点(所以w == v),但触摸将在视图的矩形之外.

public boolean dispatchTouchEvent(MotionEvent event) {
    View v = getCurrentFocus();
    boolean ret = super.dispatchTouchEvent(event);
    View w = getCurrentFocus();
    int scrcoords[] = new int[2];
    w.getLocationOnScreen(scrcoords);
    float x = event.getRawX() + w.getLeft() - scrcoords[0];
    float y = event.getRawY() + w.getTop() - scrcoords[1];

    Log.d("Activity", "Touch event "+event.getRawX()+","+event.getRawY()+" "+x+","+y+" rect "+w.getLeft()+","+w.getTop()+","+w.getRight()+","+w.getBottom()+" coords "+scrcoords[0]+","+scrcoords[1]);
    if (event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom()) ) { 
        inputManager.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
    }
    return ret;

}
Run Code Online (Sandbox Code Playgroud)

[编辑:修复小错误]