-
-
Save sc0rch/7c982999e5821e6338c25390f50d2993 to your computer and use it in GitHub Desktop.
| public class MainActivity extends Activity | |
| // ... any code | |
| /** | |
| * Clear focus on touch outside for all EditText inputs. | |
| */ | |
| @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())) { | |
| v.clearFocus(); | |
| InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); | |
| imm.hideSoftInputFromWindow(v.getWindowToken(), 0); | |
| } | |
| } | |
| } | |
| return super.dispatchTouchEvent( event ); | |
| } | |
| } |
Works perfectly! Many Thanks ❤
Not so good when you click into another EditText... keyboard is dismissed and then immediately re-opens. @DeCryptinWeb @RayNjire @sc0rch
EDIT... here is a version which includes some extra code to check whether you're clicking into another EditText... in which case you don't hide the keyboard: https://stackoverflow.com/a/61290481/4070848
To avoid keyboard dismissed and re-open everytime just evaluate the ACTION_UP and not ACTION_DOWN as follows:
if (event.getAction() == MotionEvent.ACTION_UP)
Great! It works perfect, as what I needed..
Thank you soooo much!
Very precise! works like a charm.
Thank You! It finally works :)
it's works very well thanks 👍
worked wonderfully! helped me out so much, ty!
surprised how often people find this piece of code, I don't even code on Android anymore for the last 8 years.
Here's the Kotlin implenetation if anyone's interested. Just add it below (or above) the 'onCreate' function and you're set:
/**
* Clear focus on touch outside for all EditText inputs.
*/
override fun dispatchTouchEvent(event: MotionEvent): Boolean {
if (event.action == MotionEvent.ACTION_DOWN) {
val v = currentFocus
if (v is EditText) {
val outRect = Rect()
v.getGlobalVisibleRect(outRect)
if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) {
v.clearFocus()
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(v.windowToken, 0)
}
}
}
return super.dispatchTouchEvent(event)
}
Oh wow, It works perfectly! Thank you