国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

java - Fragment中的上下滑動事件會被上一個Fragment響應而不是當前的

瀏覽:114日期:2024-02-21 09:43:02

問題描述

我當前開發(fā)一個安卓app,只有一個activity,布局文件是中有一個ViewPager,其適配器綁了三個Fragment。前兩個Fragment的布局文件都是最外層SwipeRefreshLayout用于下拉刷新,然后嵌套一個ScrollView,第三個也準備這么弄但是發(fā)現(xiàn)問題。

當我進入app默認顯示第一個Fragment時,上下滑動屏幕是有滑動效果的,然而切換到第二個Fragment滑動就沒效果。接著我發(fā)現(xiàn),當我在第二個Fragment中滑動后,再切換回第一個Fragment,發(fā)現(xiàn)反而是第一個Fragment界面響應了我的滑動操作。于是我嘗試切換到第三個Fragment,滑動后迅速切換到第二個Fragment,果然其界面正在滑動。

我并不知道這個原因到底是什么,但我試了一個辦法:通過重載setUserVisibleHint(),一旦離開一個Fragment,直接把整個Fragment設成Invisible,以這種方式,的確實現(xiàn)了滑動操作被當前Fragment響應。但我還是弄不懂之前為什么會有那樣的情況——在第一個和第二個Fragment中滑動屏幕,都是第一個Fragment響應,在第三個Fragment中滑動屏幕,則是第二個Fragment響應滑動操作。

我想知道,究竟出了什么問題,是什么原因?qū)е碌模以趺床拍芙鉀Q(不通過設置Visibility的方法強行實現(xiàn))?

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: android:layout_width='match_parent' android:layout_height='match_parent'> <ScrollViewandroid: android:layout_width='match_parent'android:layout_height='match_parent'android:descendantFocusability='blocksDescendants'> <FrameLayoutandroid:layout_width='match_parent'android:layout_height='match_parent'><WebViewandroid: android:layout_width='match_parent'android:layout_height='wrap_content'android:alpha='0'/><ProgressBar android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_gravity='center' android:visibility='gone'/> </FrameLayout> </ScrollView></android.support.v4.widget.SwipeRefreshLayout>

問題解答

回答1:

問題解決了。。有一個信息在問題中沒有描述。那就是,我為了使ViewPager切換page時動畫為淡入淡出而不是默認的滑動,實現(xiàn)了ViewPager類的一個接口ViewPager.PageTransformer。然后,我在Activity中實例化這個類,并執(zhí)行mViewPager.setPageTransformer(true, pageTransformer);就可以將切換動畫設置成我自己寫的動畫。問題就出在這個動畫上,一開始這個接口我是這么實現(xiàn)的:

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對上下滑動事件監(jiān)聽的錯亂,暫不知原因 else if (view.getVisibility() == View.INVISIBLE)view.setVisibility(View.VISIBLE); //頁面在當前界面顯示,則使其Visible,這句是為了解決Fragment對上下滑動事件監(jiān)聽的錯亂,暫不知原因} else { // (1,+Infinity] // This page is way off-screen to the right. 出了右邊屏幕 view.setAlpha(0);} }}

其中這一段代碼是我臨時用來解決問題中描述的“靈異”現(xiàn)象的:

if (alphaFactor == 0) view.setVisibility(View.INVISIBLE); //頁面不在當前界面顯示,則使其Invisible,這句是為了解決Fragment對上下滑動事件監(jiān)聽的錯亂,暫不知原因 else if (view.getVisibility() == View.INVISIBLE)view.setVisibility(View.VISIBLE); //頁面在當前界面顯示,則使其Visible,這句是為了解決Fragment對上下滑動事件監(jiān)聽的錯亂,暫不知原因

問題在哪里呢?問題就在view.setTranslationX()這個函數(shù)上,這個函數(shù)所設置的view的位置,不僅僅是視覺上的,也是實際的位置,那么看我實現(xiàn)的這段代碼,在view離開當前界面的時候,position的值處于[-Infinity,-1]和[1,+Infinity]的時候,我并沒有用setTranslationX()將其位置設置到當前界面之外,而是還是與新出現(xiàn)的view在同一位置,只不過由于用setAlpha()設置了透明度才看不見的。我是怎么發(fā)現(xiàn)這個問題的呢?就是把這個類中的調(diào)用selAlpha()的代碼全注釋掉,再次運行,終于發(fā)現(xiàn),當我切換Fragment的時候,會出現(xiàn)兩個Fragment重疊顯示的現(xiàn)象。現(xiàn)在我將這個類修改如下,問題解決(臨時代碼注釋掉了):

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對上下滑動事件監(jiān)聽的錯亂,暫不知原因 else if (view.getVisibility() == View.INVISIBLE)view.setVisibility(View.VISIBLE); //頁面在當前界面顯示,則使其Visible,這句是為了解決Fragment對上下滑動事件監(jiān)聽的錯亂,暫不知原因*/} else { // [1,+Infinity] // This page is way off-screen to the right. 出了右邊屏幕 view.setTranslationX(0);} }}

標簽: java
相關文章:
主站蜘蛛池模板: 欧美怡红院高清在线 | 91成人小视频| 男女一级 | 日本乱理伦中文三区 | 天堂成人av| 男女午夜24式免费视频 | 亚洲视频高清 | 国产成人ay手机在线观看 | 欧美视频免费一区二区三区 | 亚洲夜色 | 美国毛片亚洲社区在线观看 | 久久精品国产精品亚洲 | 国产在线精品一区二区三区不卡 | 精品国产成人综合久久小说 | 最新国产一区二区精品久久 | 久久亚洲私人国产精品 | 九九九热在线精品免费全部 | 黄色三级免费网站 | 国产一区二区中文字幕 | 色综合色狠狠天天久久婷婷基地 | 色熟 | 亚洲成人综合视频 | 999热精品这里在线观看 | 欧美成人激情在线 | 国产三级日产三级韩国三级 | 免费久草 | 亚洲一成人毛片 | a级片免费 | 国产成人精品视频午夜 | 欧美aaa| 国产精品秒播无毒不卡 | 中文字幕成人在线观看 | 日韩毛片免费在线观看 | 久久午夜影视 | 男女免费爽爽爽在线视频 | 亚洲精品综合久久中文字幕 | 中国女人18xnxx视频 | 日本一区二区三区不卡视频中文字幕 | 日本欧美色 | 国产人成久久久精品 | 影院成人区精品一区二区婷婷丽春院影视 |