如何在dispatchTouchEvent中检测MotionEvent

Sta*_*tam 0 android android-softkeyboard motionevent

我做了一个FragmentActivity.一些碎片包括一个EditText.

我想,当软输入键盘启动并MotionEvent发生时 - 除了在EditText内部单击的事件 - 要隐藏的软输入.到现在为止,我在MainActivity中编写了这段代码:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {

    InputMethodManager im = (InputMethodManager) getApplicationContext()
                                  .getSystemService(Context.INPUT_METHOD_SERVICE);
    im.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(),
                                   InputMethodManager.HIDE_NOT_ALWAYS);
    return super.dispatchTouchEvent(ev);
}
Run Code Online (Sandbox Code Playgroud)

它似乎工作.但是当我在EditText中单击时,它会隐藏并再次出现.我不希望这种情况发生.在这种情况下,我希望键盘只是保留在屏幕上.

  1. dispatchTouchEvent()当我点击Fragment里面的EditText时,有什么方法可以禁用吗?

  2. 有没有办法检测其中的EditText的click事件dispatchTouchEvent()并在那里创建条件,这会禁用隐藏的软输入?

nik*_*kvs 8

由于dispatchTouchEvent()是在屏幕上发生触摸时调用的第一个方法,因此您需要查找触摸是否属于编辑文本视图的范围.你可以得到触点,int x = ev.getRawX(); int y = ev.getRawY();

检查它是否属于editText范围的方法

boolean isWithinEditTextBounds(int xPoint, int yPoint) {
    int[] l = new int[2];
    editText.getLocationOnScreen(l);
    int x = l[0];
    int y = l[1];
    int w = editText.getWidth();
    int h = editText.getHeight();

    if (xPoint< x || xPoint> x + w || yPoint< y || yPoint> y + h) {
        return false;
    }
    return true;
} 
Run Code Online (Sandbox Code Playgroud)

在你的onDispatchTouch()中.

if(isWithinEditTextBounds(ev.getRawX,ev.getRawY))
{
//dont hide keyboard
} else {
//hide keyboard
}
Run Code Online (Sandbox Code Playgroud)