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" >