ScrollView deshabilitar el movimiento de enfoque

Tengo un simple formulario de entrada; Es un LinearLayout vertical con EditTexts dentro de un ScrollView.

<ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="10dip" android:gravity="center_vertical" android:orientation="horizontal"> <TextView style="@style/Text" android:text="Name"/> <EditText style="@style/EditBox"/> </LinearLayout> <View style="@style/Divider"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="10dip" android:gravity="center_vertical" android:orientation="horizontal"> <TextView style="@style/Text" android:text="Password"/> <EditText style="@style/EditBox"/> </LinearLayout> ... </LinearLayout> </ScrollView> 

Cuando el usuario desplaza el formulario, automáticamente mueve su foco al visible EditText. ¿Es posible inhabilitar tal comportamiento y mantener siempre el foco en el EditText seleccionado actualmente por el tacto?

Entiendo que esta puede ser una característica, pero necesito desactivarla.

¡Gracias!

Sólo pensé compartir mi solución a esto. Aunque algunos de los comentarios de la otra respuesta indican que no puede anular este comportamiento, eso no es cierto. Este comportamiento se detiene tan pronto como anula el método onRequestFocusInDescendants() . Así que simplemente cree su extensión ScrollView para hacer esto:

 public class NonFocusingScrollView extends ScrollView { public NonFocusingScrollView(Context context) { super(context); } public NonFocusingScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public NonFocusingScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) { return true; } } 

Y tu estas listo. El ScrollView se ensuciará con su enfoque no más.

Yo también he tenido un problema. La única manera que me ayudó es extender la vista de desplazamiento y anular el neigher

 @Override public ArrayList<View> getFocusables(int direction) { return new ArrayList<View>(); } 

o

 @Override protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) { return true; } 

Pero para reemplazar el ViewGroup.requestChildFocus(View child, View focused) siguiente manera:

  @Override public void requestChildFocus(View child, View focused) { // avoid scrolling to focused view // super.requestChildFocus(child, focused); } 

He probado todas las soluciones publicadas aquí, pero no funcionó en ciertas versiones de Android o se metió con algún otro comportamiento como al cambiar entre el modo táctil y no táctil (al hacer clic en los botones o usar el trackpad).

Finalmente encontré que la getFocusables del método getFocusables hizo el truco:

 public class FixedFocusScrollView extends ScrollView { public FixedFocusScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public FixedFocusScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public FixedFocusScrollView(Context context) { super(context); } @Override public ArrayList<View> getFocusables(int direction) { return new ArrayList<View>(); } } 

Lo que funcionó para mí fue combinando las respuestas de @ dmon y @ waj.

Sólo superar onRequestFocusInDescendants() funcionó muy bien cuando sólo estaba tratando con EditTexts dentro de ScrollView, pero cuando empecé a añadir varios tipos de vista, no funcionó tan bien.

Sólo superar getFocusables() no funcionó en absoluto.

onRequestFocusInDescendants() tanto onRequestFocusInDescendants() Y getFocusables() parece funcionar maravillosamente en todos los escenarios.

 public class FixedFocusScrollView extends ScrollView { public FixedFocusScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public FixedFocusScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public FixedFocusScrollView(Context context) { super(context); } @Override public ArrayList<View> getFocusables(int direction) { return new ArrayList<View>(); } @Override protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) { return true; } } 

Trate de cortar el problema desde el origen ( editar: es decir, moverlo a un archivo XML).

Primero, debe haber un elemento que pueda enfocarse para que eso suceda. Haga que todos los elementos que se pueden enfocar contenidos en ese desplazamiento se conviertan en elementos no enfocables. Hacer que se puedan enfocar después de que la vista se infla y es visible.

 android:focusable="false" android:focusableInTouchMode="false" 

Encontré otra solución fácil que funciona para mi problema.

Tengo un ScrollView con un EditText en la parte superior, y después de ella, una gran lista de TextViews, RatingBars y botones. Los botones lanzan AlertDialogs, y cuando aparecen, el ScrollView se mueve a la parte superior, al EditText que es el que todavía tiene el foco.

Para solucionarlo, establezco en el método onClick de la Actividad el requestFocusFromTouch () en la vista que se ha pulsado (en este caso el Botón).

 public void onClick(View v) { v.requestFocusFromTouch(); ... } 

Así que ahora cuando hago clic en un botón el ScrollView se mueve y poner ese botón en el centro de la pantalla, eso era justo lo que quería.

Espero que ayude.

Para tal comportamiento use nextFocusUp y nextFocusDown.

 <EditText android:id="@+id/my_edit_text" android:nextFocusDown="@id/my_edit_text" android:nextFocusUp="@id/my_edit_text" android:layout_width="wrap_content" android:layout_height="wrap_content"> </EditText> 

Me sucedió hoy, básicamente, estaba agregando una vista programática entre algunas vistas existentes, y Scroll se movía automáticamente para enfocar esa vista. Lo que acabo de hacer, es lo siguiente:

 container.setFocusable( false ); 
  • Android EditText: perder el enfoque después de la entrada
  • Mover Android Edittext un poco hacia arriba cuando se centran en él
  • Manejo de enfoque personalizado de ViewGroup
  • Android EditText AutoFocus al próximo EditText cuando está en maxlength
  • Establecer el área de enfoque de la cámara en Android
  • EditText: Evita concentrarte en setText ()
  • Centrarse en EditText en ListView cuando bloquea descendientes (Android)
  • Editado Android enfoque automático
  • Comportamiento extraño con selectAllOnFocus cuando EditText está en ListView
  • OnFocusChange no siempre funciona
  • Desplazamiento del foco de RecyclerView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.