I have an EditText
called myTextview
. I want the soft keyboard to show when I click on the EditText
but then dismiss if I click outside of
In Kotlin, I have used bellow code which is working fine
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
val v = currentFocus
if (v != null && (ev.action == MotionEvent.ACTION_UP || ev.action == MotionEvent.ACTION_MOVE)
&& v is EditText
&& !v.javaClass.name.startsWith("android.webkit.")
) {
val scrcoords = IntArray(2)
v.getLocationOnScreen(scrcoords)
val x = ev.rawX + v.getLeft() - scrcoords[0]
val y = ev.rawY + v.getTop() - scrcoords[1]
if (x < v.getLeft() || x > v.getRight() || y < v.getTop() || y > v.getBottom()
) hideKeyboard(this)
}
return super.dispatchTouchEvent(ev)
}
fun hideKeyboard(activity: Activity?) {
if (activity != null && activity.window != null && activity.window.decorView != null
) {
val imm = activity
.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(
activity.window.decorView
.windowToken, 0
)
}
}
In Java, I have used bellow code which is working fine
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
View v = getCurrentFocus();
if (v != null
&& (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE)
&& v instanceof EditText
&& !v.getClass().getName().startsWith("android.webkit.")) {
int scrcoords[] = new int[2];
v.getLocationOnScreen(scrcoords);
float x = ev.getRawX() + v.getLeft() - scrcoords[0];
float y = ev.getRawY() + v.getTop() - scrcoords[1];
if (x < v.getLeft() || x > v.getRight() || y < v.getTop()
|| y > v.getBottom())
hideKeyboard(this);
}
return super.dispatchTouchEvent(ev);
}
public static void hideKeyboard(Activity activity) {
if (activity != null && activity.getWindow() != null
&& activity.getWindow().getDecorView() != null) {
InputMethodManager imm = (InputMethodManager) activity
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(activity.getWindow().getDecorView()
.getWindowToken(), 0);
}
}