Чтобы решить эту проблему, вам сначала нужно использовать setOnFocusChangeListener этого Edittext
edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
Log.d("focus", "focus loosed");
// Do whatever you want here
} else {
Log.d("focus", "focused");
}
}
});
, а затем вам нужно переопределить dispatchTouchEvent в действии, которое содержит этот Edittext, см. Код ниже
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if ( v instanceof EditText) {
Rect outRect = new Rect();
v.getGlobalVisibleRect(outRect);
if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
Log.d("focus", "touchevent");
v.clearFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
}
return super.dispatchTouchEvent(event);
}
Теперь, что произойдет, когда пользователь щелкнет снаружи, то сначала будет вызван этот dispatchTouchEvent, который затем очистит фокус от editext, теперь ваш OnFocusChangeListener будет вызван, так как фокус был изменен теперь, здесь вы можете делать всеВы хотели надеяться, что это сработает