Следующий фрагмент просто скрывает клавиатуру:
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager =
(InputMethodManager) activity.getSystemService(
Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(
activity.getCurrentFocus().getWindowToken(), 0);
}
Вы можете поместить это в служебный класс или, если вы определяете его в действии, избегать параметра активности или вызывать hideSoftKeyboard(this).
Самое сложное - это когда это назвать. Вы можете написать метод, который повторяет каждый элемент Viewв вашей активности, и проверить, является instanceof EditTextли он setOnTouchListenerэлементом, если он не зарегистрирован в этом компоненте, и все станет на свои места. Если вам интересно, как это сделать, это на самом деле довольно просто. Вот что вы делаете, вы пишете рекурсивный метод, подобный следующему, на самом деле вы можете использовать это, чтобы делать что угодно, например, настраивать пользовательские гарнитуры и т. Д.
public void setupUI(View view) {
// Set up touch listener for non-text box views to hide keyboard.
if (!(view instanceof EditText)) {
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
hideSoftKeyboard(MyActivity.this);
return false;
}
});
}
//If a layout container, iterate over children and seed recursion.
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
View innerView = ((ViewGroup) view).getChildAt(i);
setupUI(innerView);
}
}
}
Вот и все, просто вызовите этот метод после вас setContentViewв вашей деятельности. Если вам интересно, какой параметр вы бы передали, это idродительский контейнер. Назначьте idродительский контейнер как
<RelativeLayoutPanel android:id="@+id/parent"> ... </RelativeLayout>
и позвони setupUI(findViewById(R.id.parent)), вот и все.
Если вы хотите использовать это эффективно, вы можете создать расширенный Activityи вставить этот метод, а также заставить все остальные действия в вашем приложении расширять это действие и вызывать его setupUI()в onCreate()методе.
Надеюсь, поможет.
Если вы используете более 1 действия, определите общий идентификатор для родительского макета, например
<RelativeLayout android:id="@+id/main_parent"> ... </RelativeLayout>
Затем расширяйте класс из Activityи определяйте setupUI(findViewById(R.id.main_parent))внутри него OnResume()и расширяйте этот класс вместо `` Activityin your program
Вот версия Kotlin вышеупомянутой функции:
@file:JvmName("KeyboardUtils")
fun Activity.hideSoftKeyboard() {
currentFocus?.let {
val inputMethodManager = ContextCompat.getSystemService(this, InputMethodManager::class.java)!!
inputMethodManager.hideSoftInputFromWindow(it.windowToken, 0)
}
}