Наступний фрагмент просто приховує клавіатуру:
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
якщо він не зареєструє a 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()
а розкрийте цей клас замість `` Діяльністьin your program
Ось варіант Котліна з вищевказаною функцією:
@file:JvmName("KeyboardUtils")
fun Activity.hideSoftKeyboard() {
currentFocus?.let {
val inputMethodManager = ContextCompat.getSystemService(this, InputMethodManager::class.java)!!
inputMethodManager.hideSoftInputFromWindow(it.windowToken, 0)
}
}