Je développe actuellement une application Android avec une seule activité. Il y a un ViewPager dans le fichier de mise en page et son adaptateur est lié à trois fragments. Les fichiers de mise en page des deux premiers fragments sont le SwipeRefreshLayout le plus externe pour l'actualisation déroulante, puis un ScrollView est imbriqué. Le troisième était également prêt à faire de même mais a trouvé un problème.
Lorsque j'entre dans l'application et que j'affiche le premier fragment par défaut, faire glisser l'écran de haut en bas a un effet de glissement. Cependant, passer au deuxième fragment et faire glisser n'a aucun effet. Ensuite, j'ai découvert que lorsque je glissais dans le deuxième fragment, puis revenais au premier fragment, j'ai constaté que l'interface du premier fragment répondait à mon opération de glissement. J'ai donc essayé de passer au troisième fragment, et je suis rapidement passé au deuxième fragment après avoir glissé. Effectivement, l'interface glissait.
Je ne sais pas quelle en est la raison, mais j'ai essayé une méthode : 通过重载setUserVisibleHint(),一旦离开一个Fragment,直接把整个Fragment设成Invisible,以这种方式,的确实现了滑动操作被当前Fragment响应。
Mais je ne comprends toujours pas pourquoi cela s'est produit comme ça avant - En faisant glisser l'écran dans le premier et le deuxième fragment, le premier fragment répond quand. l'écran est glissé dans le troisième Fragment, le deuxième Fragment répond à l'opération de glissement.
Je veux savoir ce qui n'a pas fonctionné, quelle en est la cause et comment puis-je le résoudre (sans le forcer en définissant la visibilité) ?
Code du fichier de mise en page du fragment (un seul est donné, l'autre est similaire) :
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/swipe_article_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:id="@+id/scroll_article_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/articleWebView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0"/>
<ProgressBar
android:id="@+id/webViewLoading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
style="@style/MyProgressBar"
android:visibility="gone"/>
</FrameLayout>
</ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
Le problème est résolu. .
.Il y a une information qui n'est pas décrite dans la question. Autrement dit, afin de faire apparaître et disparaître l'animation au lieu du glissement par défaut lorsque ViewPager change de page, j'ai implémenté une interface de la classe ViewPager, ViewPager.PageTransformer. Ensuite, j'instancie cette classe dans Activity et j'exécute
mViewPager.setPageTransformer(true, pageTransformer);
pour définir l'animation de commutation sur l'animation que j'ai moi-même écrite. Le problème réside dans cette animation. Au début, j'ai implémenté cette interface comme ceci :Ce morceau de code est ce que j'ai utilisé temporairement pour résoudre le phénomène "surnaturel" décrit dans la question :
Quel est le problème ? Le problème réside dans la fonction view.setTranslationX(). La position de la vue définie par cette fonction n'est pas seulement visuelle, mais aussi la position réelle. Regardez le code que j'ai implémenté lorsque la vue quitte l'interface actuelle, lorsque la valeur. de position est entre [-Infinity,-1] et [1,+Infinity], je n'ai pas utilisé setTranslationX() pour définir sa position en dehors de l'interface actuelle, mais elle était toujours à la même position que la vue nouvellement apparue. juste que c'est invisible car la transparence est définie avec setAlpha().
Comment ai-je découvert ce problème ? Commentez simplement tout le code qui appelle selAlpha() dans cette classe, exécutez-le à nouveau et constatez enfin que lorsque je change de fragment, deux fragments apparaîtront se chevaucher. Maintenant je modifie cette classe comme suit et le problème est résolu (le code temporaire est commenté) :