Існує більш просте рішення. Встановіть ці атрибути у батьківському макеті:
<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"
!