web-dev-qa-db-fra.com

Comment empêcher le défilement d'une vue de défilement vers une vue Web après le chargement des données

J'ai donc un problème fascinant. Malgré le fait que je ne fais pas défiler mon affichage manuellement ou par programme, on fait défiler automatiquement mon WebView après le chargement des données qu'il contient.

J'ai un fragment dans un viewpager. Lorsque je charge le téléavertisseur pour la première fois, cela fonctionne comme prévu et tout est affiché. Mais une fois que je "retourne la page", les données sont chargées et la vue Web apparaît en haut de la page, masquant les vues situées au-dessus, ce qui n'est pas souhaitable.

Est-ce que quelqu'un sait comment empêcher cela?

Ma mise en page ressemble à ceci:

<?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 ne me concentre pas non plus sur quoi que ce soit. Par défaut, il semble défiler automatiquement vers la WebView après son chargement. Comment puis-je empêcher cela?

102
Navarr

Vous pouvez simplement ajouter ceci à votre LinearLayout: Android: focusableInTouchMode = "true". Ça marche pour moi.

 <LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:focusableInTouchMode="true"
    Android:orientation="vertical" >
38
Peter Nguyen

J'ai eu le même problème, après des heures à essayer plusieurs idées, ce qui a finalement fonctionné pour moi a été simplement d'ajouter l'attribut descendantFocusability à la propriété ScrollView contenant LinearLayout, avec la valeur blockDescendants. Dans ton cas:

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

Le problème ne s'est pas reproduit depuis :)

264
mjp66

Vous devez créer une nouvelle classe extend 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, en utilisant:

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

Ça marche pour moi. ScrollView ne fera plus automatiquement défiler vers WebView.

25
user1417127

L'ajout de cette ligne dans la disposition principale résout le problème

Android:descendantFocusability="blocksDescendants"
5
arun-r

Comme ça:

<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" >
4
YaC King

Il y a probablement des gens qui ont le même problème que moi, alors je vais aider.

J'essayais de mettre Android: descendantFocusability = "beforeDescendants" dans mon ScrollView principal comme suit:

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

et cela ne fonctionnait pas, alors je devais faire un RelativeLayout le parent du ScrollView et placer le Android: descendantFocusability = "beforeDescendants" dans le parent ainsi.

Je l'ai donc résolu en procédant comme suit:

<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 */
3
Firecat

J'ai dû utiliser le nom complet de MyScrollView, sinon j'ai une exception gonfler.

<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" >
0
Cathal Coffey