当在EditText中单击时,Rect contains()返回false

时间:2016-12-15 19:13:22

标签: java android

我试图在EditText外部点击时关闭键盘。我将代码从this post (zMan's answer)复制并粘贴到我的MainActivity中。在EditText外部点击时它非常有效,但当我在其中点击时,以下代码输出以下内容:

Rect dimensions: 12 1326 958 1419   //left, top, right, bottom
event_x: 636.0 event_y: 978.0   //event_y is outside the range

问题是event_y超出了1326和1419的范围,导致键盘关闭。但是,我知道我正在使用EditText,因为它在关闭后立即重新打开,很可能是因为调用了super.onDispatchTouchEvent()。当我点击EditText时,事件的y坐标总是大约350-400个单位。

我大约98%确定问题与键盘取代EditText有关,因为EditText靠近屏幕的底部。当EditText位于屏幕顶部时,不会发生此问题。

@Override
public boolean dispatchTouchEvent( MotionEvent event )
{
    if ( event.getAction() == MotionEvent.ACTION_DOWN )
    {
        View view = getCurrentFocus();

        if ( view instanceof EditText )
        {
            Rect outRect = new Rect();
            view.getGlobalVisibleRect( outRect );

            //if touch event occurred outside of the EditText
            if ( ! outRect.contains((int)event.getRawX(), (int)event.getRawY()) )
            {
                //I SHOULD NOT REACH THIS CODE WHEN TAPPING INSIDE EditText
                Debug.print( "Rect dimensions: " + outRect.flattenToString() );
                Debug.print( "event_x: " + event.getRawX() + " event_y: " + event.getRawY() );
                ViewUtil.closeKeyboard( this );
            }
        }
    }

    return super.dispatchTouchEvent( event );
}

如果我需要提供更多信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

使用event.getX()event.getY()代替getRawX()getRawY()

答案 1 :(得分:0)

如果你只是在点击EditText外面时试图关闭键盘,那么就有了更简单的解决方案。尝试将此xml oprtions应用于EditText的父布局

<LinearLayout
     ....
     android:focusable="true"
     android:clickable="true"/>

然后它将获得焦点,EditText将丢失它。 OnFocusChangeListener将按预期工作。