如何在 dispatchTouchEvent 中检测 MotionEvent

Posted

技术标签:

【中文标题】如何在 dispatchTouchEvent 中检测 MotionEvent【英文标题】:How to detect a MotionEvent inside dispatchTouchEvent 【发布时间】:2013-12-20 09:28:13 【问题描述】:

我做了一个 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);

它似乎工作。但是当我在 EditText 内单击时,它会隐藏起来,然后又会出现。我不希望这种情况发生。在这种情况下,我希望键盘只保留在屏幕上。

    当我单击片段内的 EditText 时,有什么方法可以以某种方式禁用 dispatchTouchEvent()

    有什么方法可以检测到 dispatchTouchEvent() 内的 EditText 的点击事件并在那里设置条件,禁用软输入的隐藏?

【问题讨论】:

【参考方案1】:

由于 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;
 

在你的 onDispatchTouch() 中做。

if(isWithinEditTextBounds(ev.getRawX,ev.getRawY))

//dont hide keyboard
 else 
//hide keyboard

【讨论】:

有没有其他方法不包括获取原始分数?例如,如果单击的对象是 Edittext 的实例,则不要隐藏键盘。 一个触摸事件被android解释如下 Activity.dispatchTouchEvent() -> ViewGroup.dispatchTouchEvent->View.dispatchTouchEvent->View.onTouchListener.. 所以总是首先调用Activity.dispatchTouchevent(),之后只有我们才能知道收到触摸事件的视图。

以上是关于如何在 dispatchTouchEvent 中检测 MotionEvent的主要内容,如果未能解决你的问题,请参考以下文章

android中检測网络连接状态简单总结

dispatchTouchEvent 中看似不可能的 NullPointerException

Android中检測字符编码(GB2312,ASCII,UTF8,UNICODE,TOTAL——ENCODINGS)方法

Activity的dispatchTouchEvent调用堆栈

唯品会Gucci腰带被得物中检鉴定为假后续:消费者被迫法院维权

事件分发机制:从onClick到dispatchTouchEvent