bubbleinpit 2017-05-29 13:46 采纳率: 100%
浏览 1769
已采纳

Fragment中的上下滑动事件会被上一个Fragment响应而不是当前的,怎么办

我当前开发一个安卓app,只有一个activity,布局文件是中有一个ViewPager,其适配器绑了三个Fragment。前两个Fragment的布局文件都是最外层SwipeRefreshLayout用于下拉刷新,然后嵌套一个ScrollView,第三个也准备这么弄但是发现问题。**当我进入app默认显示第一个Fragment时,上下滑动屏幕是有滑动效果的,然而切换到第二个Fragment滑动就没效果。接着我发现,当我在第二个Fragment中滑动后,再切换回第一个Fragment,发现反而是第一个Fragment界面响应了我的滑动操作。于是我尝试切换到第三个Fragment,滑动后迅速切换到第二个Fragment,果然其界面正在**滑动。
我并不知道这个原因到底是什么,但我试了一个办法:**通过重载setUserVisibleHint(),一旦离开一个Fragment,直接把整个Fragment设成Invisible,以这种方式,的确实现了滑动操作被当前Fragment响应。**但我还是弄不懂之前为什么会有那样的情况——**在第一个和第二个Fragment中滑动屏幕,都是第一个Fragment响应,在第三个Fragment中滑动屏幕,则是第二个Fragment响应滑动操作。**
我想知道,究竟出了什么问题,是什么原因导致的,我怎么才能解决(不通过设置Visibility的方法强行实现)?
Fragment布局文件代码(只给出一个,另一个类似):

 <?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>
  • 写回答

1条回答

  • bubbleinpit 2017-05-30 13:49
    关注

    问题解决了。。
    有一个信息在问题中没有描述。那就是,我为了使ViewPager切换page时动画为淡入淡出而不是默认的滑动,实现了ViewPager类的一个接口ViewPager.PageTransformer。然后,我在Activity中实例化这个类,并执行mViewPager.setPageTransformer(true, pageTransformer);就可以将切换动画设置成我自己写的动画。问题就出在这个动画上,一开始这个接口我是这么实现的:

    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);
            }
        }
    
    }
    

    其中这一段代码是我临时用来解决问题中描述的“灵异”现象的:

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

    问题在哪里呢?问题就在view.setTranslationX()这个函数上,这个函数所设置的view的位置,不仅仅是视觉上的,也是实际的位置,那么看我实现的这段代码,在view离开当前界面的时候,position的值处于[-Infinity,-1]和[1,+Infinity]的时候,我并没有用setTranslationX()将其位置设置到当前界面之外,而是还是与新出现的view在同一位置,只不过由于用setAlpha()设置了透明度才看不见的。我是怎么发现这个问题的呢?就是把这个类中的调用selAlpha()的代码全注释掉,再次运行,终于发现,当我切换Fragment的时候,会出现两个Fragment重叠显示的现象。现在我将这个类修改如下,问题解决(临时代码注释掉了):

    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);
            }
        }
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 nginx中的CORS策略应该如何配置
  • ¥30 信号与系统实验:采样定理分析
  • ¥100 我想找人帮我写Python 的股票分析代码,有意请加mathtao
  • ¥20 Vite 打包的 Vue3 组件库,图标无法显示
  • ¥15 php 同步电商平台多个店铺增量订单和订单状态
  • ¥15 关于logstash转发日志时发生的部分内容丢失问题
  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题