On the layout of the activity/fragment that contains the edit text.
Container class Layout:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
...
<View
android:id="@+id/focus"
android:layout_width="0dp"
android:layout_height="0dp"
android:focusable="true"
android:focusableInTouchMode="true"/>
...
<com.example.MyEditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
...
</LinearLayout>
Container class:
@Override
public void onBackPressed() {
super.onBackPressed();
if (getEditText().hasFocus()) {
doSomething();
}
}
private MyEditText getEditText() {
return (MyEditText) findViewById(R.id.edit_text);
}
...
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
android.graphics.Rect rect = new android.graphics.Rect();
getEditText().getDrawingRect(rect);
if (getEditText().hasFocus() && !rect.contains((int) ev.getX(), (int) ev.getY())) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getEditText().getWindowToken(), 0);
getEditText().clearFocus();
findViewById(R.id.focus).requestFocus();
doSomething();
}
return super.dispatchTouchEvent(ev);
}
...
private void setAdjustmentListener() {
getEditText().setOnKeyboardDismissListener(new OnKeyboardDismissListener() {
@Override
public void onDismiss() {
doSomething();
}
});
}
MyEditText class:
public class MyEditText extends EditText {
private OnKeyboardDismissListener onKeyboardDismissListener;
public interface OnKeyboardDismissListener {
public void onDismiss();
}
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
this.setHintTextColor(context.getResources().getColor(android.R.color.black));
setOnEditorActionListener();
}
private void setOnEditorActionListener() {
this.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
if (onKeyboardDismissListener != null) {
onKeyboardDismissListener.onDimiss();
}
}
return false;
}
});
}
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.FLAG_EDITOR_ACTION
|| event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
if (onKeyboardDismissListener != null) {
onKeyboardDismissListener.onKeyboardDismiss();
}
}
return super.dispatchKeyEvent(event);
}
public OnKeyboardDismissListener getOnKeyboardDismissListener() {
return onKeyboardDismissListener;
}
public void setOnKeyboardDismissListener(OnKeyboardDismissListener onKeyboardDismissListener) {
this.onKeyboardDismissListener = onKeyboardDismissListener;
}
}