java - Fragment中的上下滑動(dòng)事件會(huì)被上一個(gè)Fragment響應(yīng)而不是當(dāng)前的
問(wèn)題描述
我當(dāng)前開(kāi)發(fā)一個(gè)安卓app,只有一個(gè)activity,布局文件是中有一個(gè)ViewPager,其適配器綁了三個(gè)Fragment。前兩個(gè)Fragment的布局文件都是最外層SwipeRefreshLayout用于下拉刷新,然后嵌套一個(gè)ScrollView,第三個(gè)也準(zhǔn)備這么弄但是發(fā)現(xiàn)問(wèn)題。
當(dāng)我進(jìn)入app默認(rèn)顯示第一個(gè)Fragment時(shí),上下滑動(dòng)屏幕是有滑動(dòng)效果的,然而切換到第二個(gè)Fragment滑動(dòng)就沒(méi)效果。接著我發(fā)現(xiàn),當(dāng)我在第二個(gè)Fragment中滑動(dòng)后,再切換回第一個(gè)Fragment,發(fā)現(xiàn)反而是第一個(gè)Fragment界面響應(yīng)了我的滑動(dòng)操作。于是我嘗試切換到第三個(gè)Fragment,滑動(dòng)后迅速切換到第二個(gè)Fragment,果然其界面正在滑動(dòng)。
我并不知道這個(gè)原因到底是什么,但我試了一個(gè)辦法:通過(guò)重載setUserVisibleHint(),一旦離開(kāi)一個(gè)Fragment,直接把整個(gè)Fragment設(shè)成Invisible,以這種方式,的確實(shí)現(xiàn)了滑動(dòng)操作被當(dāng)前Fragment響應(yīng)。但我還是弄不懂之前為什么會(huì)有那樣的情況——在第一個(gè)和第二個(gè)Fragment中滑動(dòng)屏幕,都是第一個(gè)Fragment響應(yīng),在第三個(gè)Fragment中滑動(dòng)屏幕,則是第二個(gè)Fragment響應(yīng)滑動(dòng)操作。
我想知道,究竟出了什么問(wèn)題,是什么原因?qū)е碌模以趺床拍芙鉀Q(不通過(guò)設(shè)置Visibility的方法強(qiáng)行實(shí)現(xiàn))?
Fragment布局文件代碼(只給出一個(gè),另一個(gè)類似):
<?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>
問(wèn)題解答
回答1:問(wèn)題解決了。。有一個(gè)信息在問(wèn)題中沒(méi)有描述。那就是,我為了使ViewPager切換page時(shí)動(dòng)畫為淡入淡出而不是默認(rèn)的滑動(dòng),實(shí)現(xiàn)了ViewPager類的一個(gè)接口ViewPager.PageTransformer。然后,我在Activity中實(shí)例化這個(gè)類,并執(zhí)行mViewPager.setPageTransformer(true, pageTransformer);就可以將切換動(dòng)畫設(shè)置成我自己寫的動(dòng)畫。問(wèn)題就出在這個(gè)動(dòng)畫上,一開(kāi)始這個(gè)接口我是這么實(shí)現(xiàn)的:
import android.support.v4.view.ViewPager;import android.view.View;/**設(shè)置Fragment切換時(shí)的動(dòng)畫為淡入淡出*/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); //阻止頁(yè)面的滑動(dòng) float alphaFactor = Math.max(MIN_ALPHA, 1 - Math.abs(position)); //透明度改變 view.setAlpha(alphaFactor); if (alphaFactor == 0)view.setVisibility(View.INVISIBLE); //頁(yè)面不在當(dāng)前界面顯示,則使其Invisible,這句是為了解決Fragment對(duì)上下滑動(dòng)事件監(jiān)聽(tīng)的錯(cuò)亂,暫不知原因 else if (view.getVisibility() == View.INVISIBLE)view.setVisibility(View.VISIBLE); //頁(yè)面在當(dāng)前界面顯示,則使其Visible,這句是為了解決Fragment對(duì)上下滑動(dòng)事件監(jiān)聽(tīng)的錯(cuò)亂,暫不知原因} else { // (1,+Infinity] // This page is way off-screen to the right. 出了右邊屏幕 view.setAlpha(0);} }}
其中這一段代碼是我臨時(shí)用來(lái)解決問(wèn)題中描述的“靈異”現(xiàn)象的:
if (alphaFactor == 0) view.setVisibility(View.INVISIBLE); //頁(yè)面不在當(dāng)前界面顯示,則使其Invisible,這句是為了解決Fragment對(duì)上下滑動(dòng)事件監(jiān)聽(tīng)的錯(cuò)亂,暫不知原因 else if (view.getVisibility() == View.INVISIBLE)view.setVisibility(View.VISIBLE); //頁(yè)面在當(dāng)前界面顯示,則使其Visible,這句是為了解決Fragment對(duì)上下滑動(dòng)事件監(jiān)聽(tīng)的錯(cuò)亂,暫不知原因
問(wèn)題在哪里呢?問(wèn)題就在view.setTranslationX()這個(gè)函數(shù)上,這個(gè)函數(shù)所設(shè)置的view的位置,不僅僅是視覺(jué)上的,也是實(shí)際的位置,那么看我實(shí)現(xiàn)的這段代碼,在view離開(kāi)當(dāng)前界面的時(shí)候,position的值處于[-Infinity,-1]和[1,+Infinity]的時(shí)候,我并沒(méi)有用setTranslationX()將其位置設(shè)置到當(dāng)前界面之外,而是還是與新出現(xiàn)的view在同一位置,只不過(guò)由于用setAlpha()設(shè)置了透明度才看不見(jiàn)的。我是怎么發(fā)現(xiàn)這個(gè)問(wèn)題的呢?就是把這個(gè)類中的調(diào)用selAlpha()的代碼全注釋掉,再次運(yùn)行,終于發(fā)現(xiàn),當(dāng)我切換Fragment的時(shí)候,會(huì)出現(xiàn)兩個(gè)Fragment重疊顯示的現(xiàn)象。現(xiàn)在我將這個(gè)類修改如下,問(wèn)題解決(臨時(shí)代碼注釋掉了):
import android.support.v4.view.ViewPager;import android.view.View;/**設(shè)置Fragment切換時(shí)的動(dòng)畫為淡入淡出*/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); //阻止頁(yè)面的滑動(dòng),位置在左則設(shè)向右偏移位置,在右則設(shè)向左偏移位置 float alphaFactor = 1 - Math.abs(position); //透明度改變 view.setAlpha(alphaFactor); /* if (alphaFactor == 0)view.setVisibility(View.INVISIBLE); //頁(yè)面不在當(dāng)前界面顯示,則使其Invisible,這句是為了解決Fragment對(duì)上下滑動(dòng)事件監(jiān)聽(tīng)的錯(cuò)亂,暫不知原因 else if (view.getVisibility() == View.INVISIBLE)view.setVisibility(View.VISIBLE); //頁(yè)面在當(dāng)前界面顯示,則使其Visible,這句是為了解決Fragment對(duì)上下滑動(dòng)事件監(jiān)聽(tīng)的錯(cuò)亂,暫不知原因*/} else { // [1,+Infinity] // This page is way off-screen to the right. 出了右邊屏幕 view.setTranslationX(0);} }}
相關(guān)文章:
1. python3.x - python連oanda的模擬交易api獲取json問(wèn)題第五問(wèn)2. docker - 如何修改運(yùn)行中容器的配置3. nignx - docker內(nèi)nginx 80端口被占用4. 域名解析在Ubuntu64 9.04計(jì)算機(jī)上的Java應(yīng)用程序中不起作用所有其他軟件可以正確解析DNS5. java - SSH框架中寫分頁(yè)時(shí)service層中不能注入分頁(yè)類6. 關(guān)于docker下的nginx壓力測(cè)試7. 為什么我ping不通我的docker容器呢???8. javascript - js代碼獲取驗(yàn)證碼倒計(jì)時(shí)問(wèn)題9. angular.js - angular內(nèi)容過(guò)長(zhǎng)展開(kāi)收起效果10. docker-machine添加一個(gè)已有的docker主機(jī)問(wèn)題
