Следующий фрагмент просто скрывает клавиатуру:
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager =
(InputMethodManager) activity.getSystemService(
Activity.INPUT_METHOD_SERVICE);
if(inputMethodManager.isAcceptingText()){
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()
.
Надеюсь, это поможет.
Если вы используете более одного действия, определите общий идентификатор для родительского макета, например <RelativeLayout android:id="@+id/main_parent"> ... </RelativeLayout>
Затем расширьте класс из Activity
и определите setupUI(findViewById(R.id.main_parent))
в его OnResume()
и расширьте этот класс вместо Activity in your program
Вот версия Kotlin вышеуказанной функции:
@file:JvmName("KeyboardUtils")
fun Activity.hideSoftKeyboard() {
currentFocus?.let {
val inputMethodManager = ContextCompat.getSystemService(this, InputMethodManager::class.java)!!
inputMethodManager.hideSoftInputFromWindow(it.windowToken, 0)
}
}
person
Navneeth G
schedule
25.07.2012
getFields()
здесь: stackoverflow.com/questions/7790487/ - person Reto   schedule 20.10.2011