Следующий фрагмент просто скрывает клавиатуру:
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)
}
}