NestedScrollView虽填、RecycleView、ViewPager 等布局方面的常見(jiàn)問(wèn)題匯總曹动,及解決

前言

在開(kāi)發(fā)中我們經(jīng)常會(huì)用到 NestedScrollView 和 RecycleView斋日,一般情況下這兩種布局是不需要進(jìn)行嵌套的,很多情況下 RecycleView 就可以自行解決墓陈,但是畢竟是一般情況恶守,因此超出一般情況外的,我們可能就需要進(jìn)行嵌套了贡必,雖然 Google 大大也不鼓勵(lì)我們這樣使用兔港。
這樣使用可能會(huì)帶來(lái)一些問(wèn)題,一如當(dāng)年的 ScrollView 和 ListView 的矛盾一樣仔拟。這里就出現(xiàn)的一些情況進(jìn)行總結(jié)和解決衫樊。
開(kāi)發(fā)中碰到的類(lèi)似的問(wèn)題,都會(huì)放在這里利花,持續(xù)更新中……

出現(xiàn)的問(wèn)題
問(wèn)題一:

NestedScrollView 和 RecycleView 嵌套時(shí)出現(xiàn)滑動(dòng)卡頓的情況

解決方法:
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setSmoothScrollbarEnabled(true);
    linearLayoutManager.setAutoMeasureEnabled(true);
    recyclerView.setHasFixedSize(true);
    recyclerView.setNestedScrollingEnabled(false);
    recyclerView.setLayoutManager(linearLayoutManager);

這個(gè)是 LinearLayoutManager 實(shí)現(xiàn) GridView 的效果橡伞,是一樣的設(shè)置盒揉,只是換成了 GridLayoutManager 即可。
其中 recyclerView.setNestedScrollingEnabled(false); 設(shè)置可以在 xml 文件中間進(jìn)行設(shè)置:android:nestedScrollingEnabled="false"

同樣我使用這種方法兑徘,一般可以解決滑動(dòng)沖突的問(wèn)題刚盈,也有一些網(wǎng)上重寫(xiě) LinearLayoutManager 的方式,根據(jù)需要進(jìn)行選擇吧挂脑,如果以上方法無(wú)法滿足藕漱,則可以選擇重寫(xiě)的方式,這個(gè)網(wǎng)上的資料很多崭闲,這里就不再重復(fù)肋联。

問(wèn)題二:

在 NestedScrollView 嵌套 RecycleView 時(shí),可能會(huì)出現(xiàn)首次進(jìn)入頁(yè)面刁俭,頁(yè)面的位置不在最頂部的問(wèn)題橄仍。有可能是停在了 RecycleView 的部位。

解決方法:
在 NestedScrollView 唯一子布局中加入
android:descendantFocusability=“blocksDescendants”

android:descendantFocusability 有三個(gè)屬性
beforeDescendants:優(yōu)先于子控件獲取焦點(diǎn)
afterDescendants:當(dāng)子控件不需要焦點(diǎn)時(shí)牍戚,獲取焦點(diǎn)
blocksDescendants:覆蓋所有子控件獲取焦點(diǎn)
問(wèn)題三:

在使用 NestedScrollView 作為父布局的時(shí)候侮繁,子布局的嵌套問(wèn)題

解決方法:

使用 NestedScrollView 和 ScrollView 是一樣的,其子布局是唯一的如孝,不然在運(yùn)行時(shí)會(huì)報(bào)錯(cuò)宪哩。因此在使用的時(shí)候要設(shè)置唯一的子布局進(jìn)行展示。

問(wèn)題四:

NestedScrollView 嵌套 ViewPager 導(dǎo)致 ViewPager 顯示不出來(lái)的問(wèn)題

解決方法:

在 NestedScrollView 的布局中加入下面代碼

android:fillViewport="true"
問(wèn)題五:

使用 ViewPager 嵌套 Fragment 時(shí)默認(rèn)的我們使用 PagerAdapter/FragmentPagerAdapter/FragmentStatePagerAdapter 來(lái)管理 Fragment第晰,這時(shí)會(huì)默認(rèn)加載的 Fragment 的個(gè)數(shù)時(shí)系統(tǒng)默認(rèn)的 DEFAULT_OFFSCREEN_PAGES = 1锁孟,即顯示一個(gè),預(yù)加載一個(gè)茁瘦,如果我們想控制加載的 Fragment 的個(gè)數(shù)需要如何處理品抽?

解決方法:

可以通過(guò)設(shè)置 ViewPager 來(lái)進(jìn)行管理

mViewPager.setOffscreenPageLimit(num);

設(shè)置這個(gè)屬性后,系統(tǒng)會(huì)加載相應(yīng)的 Fragment 的個(gè)數(shù)甜熔,但是運(yùn)行時(shí)會(huì) Crash 掉桑包,提示的下面的錯(cuò)誤:

java.lang.IllegalStateException: FragmentManager is already executing transactions
解決方法:
mViewPager = new MyViewPager(getFragmentManager());
將 getFragmentManager() 替換為 getChildFragmentManager();

FragmentManager is already executing transactions.

問(wèn)題六:

場(chǎng)景:當(dāng) ViewPager1 嵌套 Fragment0、Fragment0纺非、Fragment1、Fragment0赘方,在其中的 Fragment1 中又有一個(gè) ViewPager2烧颖,在 ViewPager2 中嵌套 Fragment2,這時(shí)當(dāng)我們滑倒 Fragment1 的時(shí)候窄陡,由于是第一次滑動(dòng)到這個(gè)位置炕淮,F(xiàn)ragment2 正常顯示,但是當(dāng)我們滑動(dòng)到其他位置跳夭,再返回到 Fragment1 時(shí)涂圆,就會(huì)出現(xiàn) Fragment1 顯示空白的問(wèn)題们镜,日志顯示,正常加載润歉。

解決方法:

1模狭、跟產(chǎn)品提出將第二層的 Fragment 提到與第一層同級(jí)上去(如果產(chǎn)品同意的話)。
2踩衩、按照下面設(shè)置:

mViewPager = new MyViewPager(getFragmentManager());
將 getFragmentManager() 替換為 getChildFragmentManager();
問(wèn)題七:

getFragmentManager()嚼鹉、getChildFragmentManager()、getSupportFragmentManager() 的區(qū)別:

解決方法:

getSupportFragmentManager(): 主要用于支持 3.0以下 android 系統(tǒng)

API 版本驱富,3.0以上系統(tǒng)可以直接調(diào)用 getFragmentManager() 锚赤,因?yàn)?br> fragment是3.0以后才出現(xiàn)的組件,為了這之前的系統(tǒng)版本也能使用
fragment,借助V4包里面的 getSupportFragmentManager() 方法來(lái)間接獲取 FragmentManager() 對(duì)象褐鸥,3.0版本之后线脚,有了 Fragment 的 api,就可以直接使用 getFragmentManager() 這個(gè)方法來(lái)獲取對(duì)象叫榕。

getFragmentManager(): 所得到的是所在 fragment 的父容器的管理器

getChildFragmentManager(): 所得到的是在 fragment 里面子容器的管理器

因此當(dāng)我們使用 Fragment 嵌套 Fragment 時(shí)浑侥,應(yīng)該使用 getChildFragmentManager()
可能會(huì)出現(xiàn)的類(lèi)似的問(wèn)題又:
1、Fragment低頻率點(diǎn)擊切換不會(huì)發(fā)生問(wèn)題翠霍,過(guò)快點(diǎn)擊馬上崩潰
2锭吨、錯(cuò)誤:Java.lang.IllegalArgumentException:No view found for id for fragment
3、調(diào)用fragment的replace方法不走onDestroy()寒匙、onDestroyView()方法零如,無(wú)法銷(xiāo)毀fragment
4、在fragment中寫(xiě)倒計(jì)時(shí)锄弱,每次切換后倒計(jì)時(shí)越來(lái)越快的問(wèn)題

參考鏈接

問(wèn)題八:

當(dāng)點(diǎn)擊上層布局結(jié)果下面的布局同時(shí)響應(yīng)點(diǎn)擊事件

解決方法:

在上層根布局中添加下面代碼:

android:clickable="true"

這樣可以使上層布局?jǐn)r截點(diǎn)擊事件考蕾,不會(huì)讓下面的布局獲取到。

問(wèn)題九:

鍵盤(pán)問(wèn)題

解決方法:
關(guān)于軟鍵盤(pán)彈出的各個(gè)屬性簡(jiǎn)介:
在manifest文件中可以設(shè)置Activity的android:windowSoftInputMode屬性会宪,這個(gè)屬性值常見(jiàn)的設(shè)置如下:
android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
那么這里值的含義列表如下:
【A】stateUnspecified:軟鍵盤(pán)的狀態(tài)并沒(méi)有指定肖卧,系統(tǒng)將選擇一個(gè)合適的狀態(tài)或依賴于主題的設(shè)置
【B】stateUnchanged:當(dāng)這個(gè)activity出現(xiàn)時(shí),軟鍵盤(pán)將一直保持在上一個(gè)activity里的狀態(tài)掸鹅,無(wú)論是隱藏還是顯示
【C】stateHidden:用戶選擇activity時(shí)塞帐,軟鍵盤(pán)總是被隱藏
【D】stateAlwaysHidden:當(dāng)該Activity主窗口獲取焦點(diǎn)時(shí),軟鍵盤(pán)也總是被隱藏的
【E】stateVisible:軟鍵盤(pán)通常是可見(jiàn)的
【F】stateAlwaysVisible:用戶選擇activity時(shí)巍沙,軟鍵盤(pán)總是顯示的狀態(tài)
【G】adjustUnspecified:默認(rèn)設(shè)置葵姥,通常由系統(tǒng)自行決定是隱藏還是顯示
【H】adjustResize:該Activity總是調(diào)整屏幕的大小以便留出軟鍵盤(pán)的空間
【I】adjustPan:當(dāng)前窗口的內(nèi)容將自動(dòng)移動(dòng)以便當(dāng)前焦點(diǎn)從不被鍵盤(pán)覆蓋和用戶能總是看到輸入內(nèi)容的部分
后記

這里只是記錄了幾種自己開(kāi)發(fā)中碰到的問(wèn)題,會(huì)持續(xù)更新這篇帖子句携,如果有人遇到過(guò)其他問(wèn)題榔幸,歡迎提問(wèn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市削咆,隨后出現(xiàn)的幾起案子牍疏,更是在濱河造成了極大的恐慌,老刑警劉巖拨齐,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳞陨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡奏黑,警方通過(guò)查閱死者的電腦和手機(jī)炊邦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)熟史,“玉大人馁害,你說(shuō)我怎么就攤上這事□迤ィ” “怎么了碘菜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)限寞。 經(jīng)常有香客問(wèn)我忍啸,道長(zhǎng),這世上最難降的妖魔是什么履植? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任计雌,我火速辦了婚禮,結(jié)果婚禮上玫霎,老公的妹妹穿的比我還像新娘凿滤。我一直安慰自己,他們只是感情好庶近,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布翁脆。 她就那樣靜靜地躺著,像睡著了一般鼻种。 火紅的嫁衣襯著肌膚如雪反番。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天叉钥,我揣著相機(jī)與錄音罢缸,去河邊找鬼。 笑死投队,一個(gè)胖子當(dāng)著我的面吹牛枫疆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛾洛,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了轧膘?” 一聲冷哼從身側(cè)響起钞螟,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谎碍,沒(méi)想到半個(gè)月后鳞滨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蟆淀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年拯啦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熔任。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡褒链,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疑苔,到底是詐尸還是另有隱情甫匹,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布惦费,位于F島的核電站兵迅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏薪贫。R本人自食惡果不足惜恍箭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞧省。 院中可真熱鬧扯夭,春花似錦、人聲如沸臀突。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)候学。三九已至藕筋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梳码,已是汗流浹背隐圾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掰茶,地道東北人暇藏。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像濒蒋,于是被迫代替她去往敵國(guó)和親盐碱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子把兔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容