Existe uma solução mais simples. Defina estes atributos no seu layout pai:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >
E agora, quando a atividade iniciar, esse layout principal terá foco por padrão.
Além disso, podemos remover o foco das visualizações filho em tempo de execução (por exemplo, depois de terminar a edição filho), dando o foco ao layout principal novamente, desta forma:
findViewById(R.id.mainLayout).requestFocus();
Bom comentário de Guillaume Perrot :
android:descendantFocusability="beforeDescendants"
parece ser o padrão (o valor inteiro é 0). Funciona apenas adicionando
android:focusableInTouchMode="true"
.
Realmente, podemos ver que o beforeDescendants
conjunto é o padrão no ViewGroup.initViewGroup()
método (Android 2.2.2). Mas não é igual a 0.ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;
Graças a Guillaume.
android:focusableInTouchMode="true"
!