我试图在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 );
}
如果我需要提供更多信息,请告诉我。
答案 0 :(得分:1)
使用event.getX()
和event.getY()
代替getRawX()
和getRawY()
答案 1 :(得分:0)
如果你只是在点击EditText外面时试图关闭键盘,那么就有了更简单的解决方案。尝试将此xml oprtions应用于EditText的父布局
<LinearLayout
....
android:focusable="true"
android:clickable="true"/>
然后它将获得焦点,EditText将丢失它。 OnFocusChangeListener将按预期工作。