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?
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" >
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 :)
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.
L'ajout de cette ligne dans la disposition principale résout le problème
Android:descendantFocusability="blocksDescendants"
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" >
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 */
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" >