108 votes

Comment empêcher un scrollview de défilement à un webview après chargement des données?

Donc, j'ai un problème fascinant. Malgré le fait que je ne suis pas manuellement ou par programmation de défilement de mon point de vue, mon WebView est automatiquement affichée après les données à l'intérieur de la charge.

J'ai un fragment dans un viewpager. Quand j'ai d'abord charger le pager, il fonctionne comme prévu et tout est montré. Mais une fois que j'ai "tourner la page" les chargements de données et la WebView apparaît en haut de la page, se cachant de la vue au-dessus d'elle, ce qui est indésirable.

Personne ne sait comment empêcher que cela se produise?

Ma mise en page ressemble à:

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

Je suis également pas de donner le focus à quoi que ce soit. Par défaut, il me semble pour faire défiler automatiquement les WebView après qu'il a chargé. Comment puis-je éviter cela?

268voto

mjp66 Points 644

J'ai eu le même problème, après des heures à essayer plusieurs idées, ce qui a finalement fonctionné pour moi était simplement en ajoutant de l' "descendantFocusability" attribut à la ScrollView contenant LinearLayout, avec la valeur "blockDescendants". Dans votre cas:

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

N'ai pas eu le problème de se reproduire depuis :)

43voto

Peter Nguyen Points 31

Vous pouvez simplement ajouter ceci à votre LinearLayout: android:focusableInTouchMode="true". Il fonctionne pour moi.

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

26voto

user1417127 Points 663

Vous devez créer une nouvelle classe d'étendre le ScrollView, puis Remplacer requestChildFocus:

public class MyScrollView extends ScrollView {

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

Puis dans votre mise en page xml, à l'aide de:

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

Qui fonctionne pour moi. La ScrollView ne sera pas de défilement automatique de la WebView plus.

6voto

arun-jamhub Points 21

L'ajout de ces ligne dans la page principale résout le problème

android:descendantFocusability="blocksDescendants"

1voto

whitebrow Points 116

Découvrez cette réponse: http://stackoverflow.com/a/8101614/425238

Il conserve la focalisation de l'enfant vues (et donc l'accès)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X