這篇文章主要講解了“Android中如何解決嵌套滑動(dòng)沖突”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Android中如何解決嵌套滑動(dòng)沖突”吧!
10年積累的網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)制作后付款的網(wǎng)站建設(shè)流程,更有工布江達(dá)免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。一.會(huì)產(chǎn)生滑動(dòng)沖突的情況
那么什么時(shí)候會(huì)產(chǎn)生滑動(dòng)沖突呢?比如你有個(gè)activity,activity的上半部分是一個(gè)布局,下半部分是一個(gè)可滑動(dòng)控件(RecyclerView、ListView等),或者下半部分是個(gè)viewpager,里面的fragment布局是一個(gè)可滑動(dòng)控件,這樣的頁(yè)面就會(huì)產(chǎn)生滑動(dòng)沖突。
二.以前的做法
雖然我以前的筆記丟失了,但是當(dāng)時(shí)的解決問題的思路我依然記得。
(1)重寫一個(gè)viewpager繼承系統(tǒng)的ViewPager,至于怎么重寫的我不太記得了
(2)重寫RecyclerView繼承系統(tǒng)的RecyclerView,因?yàn)槲矣浀脮?huì)出現(xiàn)高度的原因?qū)е翿ecyclerView不設(shè)置固定高度的話會(huì)不顯示或者只顯示一個(gè)Item,所以要重寫RecyclerView去動(dòng)態(tài)衡量Item x count 的高度。
當(dāng)時(shí)雖然能解決,但是最后的效果很變扭。
三.現(xiàn)在的做法
現(xiàn)在我肯定不會(huì)像之前一樣做,因?yàn)槌隽艘粋€(gè)新控件NestedScrollView。它能夠很好的幫我們解決滑動(dòng)沖突,接下來我會(huì)盡我所能分析所有可能出現(xiàn)的情況。
1.布局只嵌套R(shí)ecyclerView的情況
就是如下圖的情況:
這種情況最容易解決,就直接使用NestedScrollView做父布局,然后嵌套R(shí)ecyclerView就行。
這樣就行,切記要記住兩點(diǎn):
(1)在父布局NestedScrollView加android:fillViewport="true",然后RecyclerView會(huì)不顯示出來,不顯示出來的原因是RecyclerView是一個(gè)動(dòng)態(tài)展示的View,而直接使用的話用我之前說的話叫做會(huì)被壓扁,所以加這個(gè)屬性讓子View顯示match_parent的效果。
(2)有的人說要給RecyclerView設(shè)setNestedScrollingEnabled(false),不然滑動(dòng)時(shí)會(huì)卡,這個(gè)我沒試過,我設(shè)的是true,目前感覺滑動(dòng)時(shí)沒什么影響。
2.布局嵌套其它可滾動(dòng)控件的情況
就是在第一種情況下把RecyclerView換成其它可滑動(dòng)控件。
直接說吧,你要用NestedScrollView才有用,原因是解決滑動(dòng)沖突的關(guān)鍵在于NestedScrollingParent和NestedScrollingChild兩個(gè)接口(下面會(huì)詳細(xì)說)
而RecyclerView和NestedScrollView都實(shí)現(xiàn)NestedScrollingChild接口,并在內(nèi)部封裝了解決滑動(dòng)沖突的邏輯處理,所以只有NestedScrollView直接嵌套R(shí)ecyclerView或NestedScrollView不會(huì)產(chǎn)生滑動(dòng)沖突。
NestedScrollView的用法和RecyclerView一樣,記得加那些屬性。
3.布局嵌套ViewPager,ViewPager嵌套R(shí)ecyclerView等可滑動(dòng)控件的情況
這種情況處理起來比較麻煩,而很多人都是碰到這種情況。如下圖:
那就是使用CoordinatorLayout,使用CoordinatorLayout能解決這種情況。
但是CoordinatorLayout有BUG,使用起來卡得像坨屎一樣,不管你能不能忍,反正我是不能忍,所以我不會(huì)使用CoordinatorLayout。
不用CoordinatorLayout還有以下三種解決辦法:
(1)使用github上面開源的那個(gè)自定義CoordinatorLayout來解決,叫什么我忘了。
但是我們老大說了,好別用別人的開源View。于是我只能用第二種方法。
(2)放棄使用ViewPager
為什么,因?yàn)橄到y(tǒng)的ViewPager做不到,上面有說到能解決沖突是因?yàn)镹estedScrollingParent和NestedScrollingChild,并且NestedScrollingChild的ViewGroup要是實(shí)現(xiàn)NestedScrollingParent接口的View,NestedScrollingParent的ChildView要是實(shí)現(xiàn)NestedScrollingChild接口的View。
而圖中的父布局和RecyclerView隔著一個(gè)ViewPager,也就是說NestedScrollingParent的ChildView是ViewPager,NestedScrollingChild的ViewGroup是ViewPager。所以說直接嵌套一層ViewPager的情況是無法解決滑動(dòng)沖突的。
那有一個(gè)很直接的辦法就是不用ViewPager,用FragmentManager,這樣就能實(shí)現(xiàn)解決滑動(dòng)沖突。
.........................................
這里的FrameLayout就是給FragmentManager來顯示FrameLayout。
這樣做就能解決一個(gè)activity多個(gè)fragment的情況下的滑動(dòng)沖突。
但是有的朋友說不嘛,我就要Viewpager,我就要酷酷的滑動(dòng)動(dòng)畫效果。唉,那你就用最實(shí)在的第三中方法吧。
(3)自定義
沒辦法了,那就用自定義吧,自定義一個(gè)VIewGroup實(shí)現(xiàn)NestedScrollingParent接口,然后自定義一個(gè)View實(shí)現(xiàn)NestedScrollingChild接口?;蛘吣憧梢酝鈱邮褂肗estedScrollView,內(nèi)層自定義ViewPager來實(shí)現(xiàn)NestedScrollingChild接口。
你以為這樣就完啦?當(dāng)然沒這么簡(jiǎn)單。在NestedScrollingChild接口中有這些方法。
你需要在這些方法里面自己寫上處理滑動(dòng)沖突的邏輯,你可以參考RecyclerView的去寫,也可以在網(wǎng)上找,網(wǎng)上有一些大神是真的有介紹,但也有一些人要么瞎JB抄別人的又不抄完,要么只會(huì)說用CoordinatorLayout。我其實(shí)也不是很會(huì)里面的細(xì)節(jié)處理,只是知道流程而已,所以也不裝X了。
四.其它使用時(shí)的問題
并非解決滑動(dòng)沖突就沒有其它問題。
1.NestedScrollView(RecyclerView)重新加載數(shù)據(jù)時(shí)會(huì)自動(dòng)滾動(dòng)到底部。
如果你碰到這種情況,只要給父布局的NestedScrollView設(shè).scrollTo(0, 0)就行,和ScrollView一樣的。
2.禁止滑動(dòng)。
如果你想在某些情況下禁止NestedScrollView滑動(dòng),可以像處理ScrollView一樣,在父布局的NestedScrollView加入監(jiān)聽,例如我這:
public void isScroll(boolean bol){ Nsv.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return !bol; } }); }
這個(gè)方法是設(shè)置可滑動(dòng)和不可滑動(dòng)。
3.記得設(shè)android:fillViewport="true"
如果你嵌套的布局沒有顯示,那有可能你忘了給父布局NestedScrollView設(shè)置android:fillViewport屬性。
感謝各位的閱讀,以上就是“Android中如何解決嵌套滑動(dòng)沖突”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Android中如何解決嵌套滑動(dòng)沖突這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!