visual vista para ojos ocular miopia mejorar los lejos gimnasia ejercicios cansados borrosa astigmatismo android focus android-scrollview

android - vista - gimnasia ocular pdf



ScrollView deshabilitar movimiento de enfoque (8)

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

Obtuve un ScrollView con un EditText en la parte superior y, después, una gran lista de TextViews, RatingBars y Buttons. Los Botones inician AlertDialogs y, cuando aparecen, ScrollView se desplaza a la parte superior, al EditText que es el que aún tiene el foco.

Para resolverlo, establezco en el método onClick de la Actividad el requestFocusFromTouch () a la vista en la que se hizo clic (en este caso, el Botón).

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

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

Espero que te ayude.

Tengo un formulario de entrada simple; 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, mueve automáticamente su enfoque al EditarTexto visible. ¿Es posible deshabilitar dicho comportamiento y mantener siempre el foco en el texto de edición actualmente seleccionado al tocar?

Entiendo que esto puede ser una característica, pero necesito desactivarlo.

¡Gracias!


Hoy me sucedió, básicamente estaba agregando una Vista programáticamente entre algunas vistas existentes, y Scroll se movió automáticamente para enfocar esa vista. Lo que acabo de hacer, es lo siguiente:

container.setFocusable( false );


Intente cortar el problema desde la fuente ( edite: por ejemplo, muévalo a un archivo XML).

Primero, debe haber un elemento enfocable para que eso suceda. Convierta todos los elementos enfocables contenidos en ese desplazamiento en elementos no enfocables. Haz que se puedan enfocar después de que la vista esté inflada y sea visible.

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


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

Solo anular onRequestFocusInDescendants() funcionó muy bien cuando solo estaba tratando con EditTexts dentro de ScrollView, pero cuando comencé a agregar varios tipos de vista, no funcionó tan bien.

Solo anular getFocusables() no funcionó en absoluto.

La onRequestFocusInDescendants() y getFocusables() parece funcionar perfectamente 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; } }


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>


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

Finalmente encontré que al reemplazar el 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>(); } }


Solo pensé en 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 reemplaza el método onRequestFocusInDescendants() . Así que simplemente crea tu 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 volverá a meterse con tu enfoque.


Yo también he tenido un problema. La única forma en que me ayudó es ampliar la vista de desplazamiento y anular el vecino

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

o

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

pero para anular 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); }