2015-01-14 103 views
2

在我的活动中,我有一个EditTextButton。点击EditText时,我忽略了dispatchTouchEvent以隐藏软键盘。如何避免点击按钮时调用dispatchTouchEvent

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 
    View view = getCurrentFocus(); 
    boolean ret = super.dispatchTouchEvent(event); 

    if (view instanceof EditText) { 
     View w = getCurrentFocus(); 
     int scrcoords[] = new int[2]; 
     w.getLocationOnScreen(scrcoords); 
     float x = event.getRawX() + w.getLeft() - scrcoords[0]; 
     float y = event.getRawY() + w.getTop() - scrcoords[1]; 

     if (event.getAction() == MotionEvent.ACTION_UP 
       && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w 
         .getBottom())) { 
      InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(getWindow().getCurrentFocus() 
        .getWindowToken(), 0); 
     } 
    } 
    return ret; 
} 

的问题是,每次我点击Button,该dispatchTouchEvent将被调用,这样软键盘就会消失,这不是我想要的。当我点击Button时,我不想隐藏键盘。我在想的是,当我点击Button时,是否可以避免拨打dispatchTouchEvent

任何反馈将不胜感激。

+0

添加逻辑来检测'Button'的坐标吗?或者,如果布局的其余部分不是交互式的,则只需在主布局上触摸侦听器就可以执行此操作。 – corsair992

回答

1

您不需要重写dispatchTouch事件。只需将您的onClickListener设置为与Button和EditText相同,然后调用方法来隐藏开关盒的“默认”情况下的软键盘。

switch (v.getId()) 
    { 
     case R.id.button: 
      whateverButtonDoes(); 
      break; 
     case R.id.editText: 
      whateverEditTextDoes(); 
      break; 
     default: 
      hideKeyboard(); 
      break; 
    } 

我强烈建议您定义一个方法来隐藏键盘清晰的编码标准。你也可以在其他地方使用它。

+0

v.getid()里面dispatchTouchEvent是不同于R.id.button这是我的按钮,你可以告诉我为什么会这样? –

相关问题