当用户点击android中屏幕上的任何其他位置时隐藏键盘

时间:2012-01-02 04:52:38

标签: android onclick android-softkeyboard

当用户点击Edittext以外的任何地方时,我需要隐藏android中的softkeypad。 iphone有很多帮助,但不适用于android。我尝试了这段代码,但它不起作用:(

final RelativeLayout base = (RelativeLayout) findViewById(R.id.RelativeLayout1);

    findViewById(R.id.base).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(base.getWindowToken(), 0);

        }
    });

提前致谢!

6 个答案:

答案 0 :(得分:55)

您可以使用onTouchEvent()隐藏Softkeyboard

@Override
    public boolean onTouchEvent(MotionEvent event) {
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.
                                                        INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        return true;
    }

虽然这个解决方案有效,但我建议最好使用answer以下,因为它提供了关闭键盘触摸其他任何地方然后EditText的最佳解决方案。

答案 1 :(得分:26)

我这样做了:

活动中添加代码。

这也适用于片段无需片段中添加此代码。

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    View view = getCurrentFocus();
    if (view != null && (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE) && view instanceof EditText && !view.getClass().getName().startsWith("android.webkit.")) {
        int scrcoords[] = new int[2];
        view.getLocationOnScreen(scrcoords);
        float x = ev.getRawX() + view.getLeft() - scrcoords[0];
        float y = ev.getRawY() + view.getTop() - scrcoords[1];
        if (x < view.getLeft() || x > view.getRight() || y < view.getTop() || y > view.getBottom())
        ((InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow((this.getWindow().getDecorView().getApplicationWindowToken()), 0);
    }
    return super.dispatchTouchEvent(ev);
}

希望这会对你有所帮助。

答案 2 :(得分:14)

我找到的最佳工作是使用如下,

覆盖dispatchTouchEvent()并尝试使用EditText

获取Rect的区域
 @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
         int x = (int) ev.getX();
         int y = (int) ev.getY();

         if (ev.getAction() == MotionEvent.ACTION_DOWN &&
             !getLocationOnScreen(etFeedback).contains(x, y)) {
             InputMethodManager input = (InputMethodManager) 
                                   activity.getSystemService(Context.INPUT_METHOD_SERVICE);
             input.hideSoftInputFromWindow(etFeedback.getWindowToken(), 0);
         }

        return super.dispatchTouchEvent(ev);
    }

计算View的4个角(此处为EditText)

的方法
protected Rect getLocationOnScreen(EditText mEditText) {
        Rect mRect = new Rect();
        int[] location = new int[2];

        mEditText.getLocationOnScreen(location);

        mRect.left = location[0];
        mRect.top = location[1];
        mRect.right = location[0] + mEditText.getWidth();
        mRect.bottom = location[1] + mEditText.getHeight();

        return mRect;
    }

通过使用上面的代码,我们可以检测到EditText的区域,我们可以检查屏幕上的触摸是否是EditText区域的一部分。如果EditText的部分没有做任何事情,那么让触摸完成它的工作,如果触摸不包含EditText的区域,那么只需关闭软键盘。

****** ****** EDIT

如果我们不想将任何EditText作为输入并且想要在用户触摸EditText以外的任何其他地方时隐藏整个应用程序中的键盘,我就找到了另一种方法。然后你必须创建一个BaseActivity并编写隐藏键盘的全局代码,如下所示,

 @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        boolean handleReturn = super.dispatchTouchEvent(ev);

        View view = getCurrentFocus();

         int x = (int) ev.getX();
         int y = (int) ev.getY();

         if(view instanceof EditText){
             View innerView = getCurrentFocus();

             if (ev.getAction() == MotionEvent.ACTION_UP && 
                                    !getLocationOnScreen(innerView).contains(x, y)) {

                 InputMethodManager input = (InputMethodManager) 
                                  getSystemService(Context.INPUT_METHOD_SERVICE);
                 input.hideSoftInputFromWindow(getWindow().getCurrentFocus()
                                                                 .getWindowToken(), 0);
             }
         }

        return handleReturn;
    }

答案 3 :(得分:0)

我试过这个隐藏键盘。您需要在布局文件中传递该方法。

public void setupUI(View view) {
    // Set up touch listener for non-text box views to hide keyboard.
    if (!(view instanceof EditText)) {
        view.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                hideSoftKeyboard(LOGSignUpActivity.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);
        }
    }
}

答案 4 :(得分:0)

MainAcitivity.class

中调用此方法
  public static void hideKeyboardwithoutPopulate(BaseActivity activity) {
    InputMethodManager inputMethodManager =
            (InputMethodManager) activity.getSystemService(
                    Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(
            activity.getCurrentFocus().getWindowToken(), 0);
}

答案 5 :(得分:0)

对于那些正在为此寻找Xamarin代码的人,请转到:

  public override bool DispatchTouchEvent(MotionEvent ev)
    {
        try
        {
            View view = CurrentFocus;
            if (view != null && (ev.Action == MotionEventActions.Up || ev.Action == MotionEventActions.Move) && view is EditText && !view.Class.Name.StartsWith("android.webkit."))
            {
                int[] Touch = new int[2];
                view.GetLocationOnScreen(Touch);
                float x = ev.RawX + view.Left - Touch[0];
                float y = ev.RawY + view.Top - Touch[1];
                if (x < view.Left || x > view.Right || y < view.Top || y > view.Bottom)
                    ((InputMethodManager)GetSystemService(InputMethodService)).HideSoftInputFromWindow((Window.DecorView.ApplicationWindowToken), 0);
            }
        }
        catch (System.Exception ex)
        {

        }

        return base.DispatchTouchEvent(ev);
    }