java - Les événements de glissement vers le haut et vers le bas dans le fragment recevront une réponse au fragment précédent au lieu du fragment actuel
某草草
某草草 2017-05-31 10:37:03
0
1
965

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>
某草草
某草草

répondre à tous(1)
刘奇

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 :

.
import android.support.v4.view.ViewPager;
import android.view.View;

/*
*设置Fragment切换时的动画为淡入淡出
*/

public class NoSlidingPageTransformer implements ViewPager.PageTransformer {
    private static final float MIN_ALPHA = 0.0f;    //最小透明度

    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();    //得到view宽

        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left. 出了左边屏幕
            view.setAlpha(0);

        } else if (position <= 1) { // [-1,1]
            view.setTranslationX(-pageWidth * position);  //阻止页面的滑动
            float alphaFactor = Math.max(MIN_ALPHA, 1 - Math.abs(position));
            //透明度改变
            view.setAlpha(alphaFactor);
            if (alphaFactor == 0)
                view.setVisibility(View.INVISIBLE);     //页面不在当前界面显示,则使其Invisible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
            else if (view.getVisibility() == View.INVISIBLE)
                view.setVisibility(View.VISIBLE);       //页面在当前界面显示,则使其Visible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
        } else { // (1,+Infinity]
            // This page is way off-screen to the right.    出了右边屏幕
            view.setAlpha(0);
        }
    }

}

Ce morceau de code est ce que j'ai utilisé temporairement pour résoudre le phénomène "surnaturel" décrit dans la question :

if (alphaFactor == 0)
    view.setVisibility(View.INVISIBLE);     //页面不在当前界面显示,则使其Invisible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
    else if (view.getVisibility() == View.INVISIBLE)
        view.setVisibility(View.VISIBLE);       //页面在当前界面显示,则使其Visible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因

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é) :

import android.support.v4.view.ViewPager;
import android.view.View;

/*
*设置Fragment切换时的动画为淡入淡出
*/

public class NoSlidingPageTransformer implements ViewPager.PageTransformer {

    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();    //得到view宽

        if (position <= -1) { // [-Infinity,-1]
            // This page is way off-screen to the left. 出了左边屏幕
            view.setTranslationX(0);

        } else if (position < 1) { // (-1,1)
            view.setTranslationX(-pageWidth * position);  //阻止页面的滑动,位置在左则设向右偏移位置,在右则设向左偏移位置
            float alphaFactor = 1 - Math.abs(position);
            //透明度改变
            view.setAlpha(alphaFactor);
            /*
            if (alphaFactor == 0)
                view.setVisibility(View.INVISIBLE);     //页面不在当前界面显示,则使其Invisible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
            else if (view.getVisibility() == View.INVISIBLE)
                view.setVisibility(View.VISIBLE);       //页面在当前界面显示,则使其Visible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
                */
        } else { // [1,+Infinity]
            // This page is way off-screen to the right.    出了右边屏幕
            view.setTranslationX(0);
        }
    }

}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal