studio programacion para herramientas fundamentos desarrollo con avanzado aplicaciones android android-layout android-webview android-viewpager android-scrollview

programacion - manual android studio avanzado



¿Cómo evitar que scrollview se desplace a una vista web después de cargar los datos? (7)

Agregar estas líneas en el diseño principal resuelve el problema

android:descendantFocusability="blocksDescendants"

Entonces tengo un problema fascinante. A pesar de que no estoy desplazando manual o programáticamente mi vista, mi WebView se desplaza automáticamente después de cargar los datos que contiene.

Tengo un fragmento en un visor. Cuando primero carga el buscapersonas, funciona como se esperaba y se muestra todo. Pero una vez que "volteo la página", los datos se cargan y la WebView aparece en la parte superior de la página, ocultando las vistas que están sobre ella, lo cual es indeseable.

¿Alguien sabe cómo evitar que esto suceda?

Mi diseño se ve así:

<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/background" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/article_title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_marginBottom="2dp" android:text="Some Title" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="@color/article_title" android:textStyle="bold" /> <LinearLayout android:id="@+id/LL_Seperator" android:layout_width="fill_parent" android:layout_height="1dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:background="@color/text" android:orientation="horizontal" > </LinearLayout> <WebView android:id="@+id/article_content" android:layout_width="match_parent" android:layout_marginRight="10dp" android:layout_marginLeft="10dp" android:layout_height="wrap_content" /> <TextView android:id="@+id/article_link" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="5dp" android:layout_marginTop="5dp" android:layout_marginRight="10dp" android:layout_marginLeft="10dp" android:text="View Full Article" android:textColor="@color/article_title" android:textStyle="bold" /> </LinearLayout> </ScrollView>

Tampoco estoy enfocando nada. De forma predeterminada, parece desplazarse automáticamente a WebView después de que se haya cargado. ¿Cómo evito esto?


Debería crear una nueva clase extender ScrollView y luego anular requestChildFocus:

public class MyScrollView extends ScrollView { @Override public void requestChildFocus(View child, View focused) { if (focused instanceof WebView ) return; super.requestChildFocus(child, focused); } }

Luego en su diseño xml, usando:

<MyScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/background" >

Funciona para mi. ScrollView ya no se desplazará automáticamente a WebView.


Me gusta esto:

<com.ya.test.view.MyScrollView android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability="beforeDescendants" android:focusable="true" android:focusableInTouchMode="true" >


Probablemente hay personas que tienen el mismo problema que yo, así que ayudaré.

Estaba tratando de poner android: descenddantFocusability = "beforeDescendants" en mi ScrollView principal de la siguiente manera:

<ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability="beforeDescendants"> /*my linearlayout or whatever to hold the views */

y no funcionaba, así que tuve que hacer un RelativeLayout, el padre de ScrollView, y colocar el android: descenddantFocusability = "beforeDescendants" también en el padre.

Así que lo resolví haciendo lo siguiente:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability="blocksDescendants"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> /*my linearlayout or whatever to hold the views */


Simplemente puede agregar esto a su LinearLayout: android: focusableInTouchMode = "true". Esto funciona para mi.

<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:focusableInTouchMode="true" android:orientation="vertical" >


Tuve el mismo problema, después de horas de probar varias ideas, lo que finalmente funcionó para mí fue simplemente agregar el atributo descendantFocusability a ScrollView que contiene LinearLayout, con el valor blockDescendants . En tu caso:

<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:descendantFocusability="blocksDescendants" >

No ha vuelto a ocurrir el problema desde :)


Tuve que usar el nombre completamente calificado para MyScrollView, de lo contrario obtuve una excepción inflar.

<com.mypackagename.MyScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/background" >