Существует более простое решение. Установите эти атрибуты в родительском макете:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >
И теперь, когда действие начинается, этот основной макет получит фокус по умолчанию.
Кроме того, мы можем удалить фокус из дочерних представлений во время выполнения (например, после завершения дочернего редактирования), снова предоставив фокус основному макету, например так:
findViewById(R.id.mainLayout).requestFocus();
Хороший комментарий от Гийома Перро :
android:descendantFocusability="beforeDescendants"
кажется по умолчанию (целочисленное значение равно 0). Это работает просто путем добавления
android:focusableInTouchMode="true"
.
Действительно, мы видим, что beforeDescendants
в ViewGroup.initViewGroup()
методе установлено значение по умолчанию (Android 2.2.2). Но не равно 0.ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;
Спасибо Гийому.
android:focusableInTouchMode="true"
!