I finally solved my problem, the solution is to use dispatchKeyEventPreIme. Below is snippet from my actual code:
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
Log.e(TAG, "dispatchKeyEventPreIme(" + event + ")");
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
KeyEvent.DispatcherState state = getKeyDispatcherState();
if (state != null) {
Log.e(TAG, "dispatchKeyEventPreIme state != null");
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getRepeatCount() == 0) {
Log.e(TAG, "dispatchKeyEventPreIme ACTION_DOWN");
state.startTracking(event, this);
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP
&& !event.isCanceled() && state.isTracking(event)) {
Log.e(TAG, "dispatchKeyEventPreIme ACTION_UP");
if (edtTransactionAmt.hasFocus()
|| edtTransactionDesc.hasFocus()) {
Log.e(TAG, "dispatchKeyEventPreIme edittext has focus");
AppUtils.hideSoftKeyboard(context, edtTransactionAmt);
edtTransactionAmt.clearFocus();
edtTransactionDesc.clearFocus();
} else {
Log.e(TAG, "dispatchKeyEventPreIme dismiss view");
dismiss();
}
return true;
}
}
}
return super.dispatchKeyEventPreIme(event);
}
But the actual credit goes to this post.