BottomSheetBehavior下ViewPager2的滑動(dòng)問(wèn)題

BottomSheetBehavior下ViewPager2的滑動(dòng)問(wèn)題

該布局結(jié)構(gòu)下谣沸,ViewPager2下的RecyclerView無(wú)法響應(yīng)滑動(dòng)祈噪。

ViewPager2上的RecyclerView充當(dāng)Tab作用

問(wèn)題點(diǎn)

現(xiàn)象:BottomSheetBehavior可以正常折疊台妆,展開(kāi)绽榛,收起瞭郑。展開(kāi)狀態(tài)下氮趋,滑動(dòng)ViewPager2伍派,無(wú)反應(yīng)。BottomSheetBehavior可以正常響應(yīng)事件剩胁,同時(shí)诉植,事件被攔截?zé)o法傳遞到ViewPager2中。

為啥會(huì)被攔截昵观?

在onInterceptTouchEvent的返回值晾腔,有這樣一串邏輯:

View scroll = nestedScrollingChildRef != null ? nestedScrollingChildRef.get() : null;
    return action == MotionEvent.ACTION_MOVE
        && scroll != null
        && !ignoreEvents
        && state != STATE_DRAGGING
        && !parent.isPointInChildBounds(scroll, (int) event.getX(), (int) event.getY())
        && viewDragHelper != null
        && Math.abs(initialY - event.getY()) > viewDragHelper.getTouchSlop();

isPointInChildBounds比較特殊,用于判斷手勢(shì)在不在"scroll"活動(dòng)范圍內(nèi)啊犬。

nestedScrollingChildRef取值邏輯

在onLayoutChild中通過(guò)findScrollingChild賦值灼擂。

View findScrollingChild(View view) {
    if (ViewCompat.isNestedScrollingEnabled(view)) {
      return view;
    }
    if (view instanceof ViewGroup) {
      ViewGroup group = (ViewGroup) view;
      for (int i = 0, count = group.getChildCount(); i < count; i++) {
        View scrollingChild = findScrollingChild(group.getChildAt(i));
        if (scrollingChild != null) {
          return scrollingChild;
        }
      }
    }
    return null;
  }

通過(guò)判斷isNestedScrollingEnabled來(lái)決定,并且是布局中的第一個(gè)觉至。那應(yīng)該就是布局中ViewPage2上方的RecyclerView了剔应,將其nestedScrollingEnabled設(shè)為false試試看效果,結(jié)果ViewPage2部分可以上下滑動(dòng)了,BottomSheetBehavior又不能展開(kāi)了峻贮。根據(jù)對(duì)嵌套滑動(dòng)的了解席怪,RecyclerView在響應(yīng)滑動(dòng)事件的同時(shí),也會(huì)將事件傳遞到父View中纤控,也就意味著是BottomSheetBehavior響應(yīng)的觸發(fā)邏輯出了問(wèn)題挂捻。onNestedPreScroll中有這樣一段邏輯,判斷是不是同一個(gè)view船万。

@Override
  public void onNestedPreScroll(
      @NonNull CoordinatorLayout coordinatorLayout,
      @NonNull V child,
      @NonNull View target,
      int dx,
      int dy,
      @NonNull int[] consumed,
      int type) {

        ...

    View scrollingChild = nestedScrollingChildRef != null ? nestedScrollingChildRef.get() : null;
    if (target != scrollingChild) {
      return;
    }

        ...

  }

target是真正滑動(dòng)的view刻撒,即ViewPage2 item中的RecyclerView。而scrollingChild則成了ViewPager2的內(nèi)部實(shí)現(xiàn)RecyclerViewImpl唬涧。從而導(dǎo)致BottomSheetBehavior不會(huì)同步滑動(dòng)疫赎。那么就簡(jiǎn)單了,反射將RecyclerViewImpl的nestedScrollingEnabled關(guān)閉碎节,就可以修正這一問(wèn)題捧搞。

但隨之而來(lái)一個(gè)新的問(wèn)題,在切換tab的時(shí)候(也就是ViewPager2上方的RecyclerView)狮荔,仍然會(huì)失效胎撇。原因也很簡(jiǎn)單,nestedScrollingChildRef仍然是ViewPager2中前一個(gè)item中的View殖氏。

如何修復(fù)晚树?

重新觸發(fā)nestedScrollingChildRef的賦值邏輯,因在layout的過(guò)程中賦值雅采,只要requestLayout就可以達(dá)到目的爵憎。或者直接反射修改值婚瓜。

總結(jié)

將BottomSheetBehavior中所有子View的isNestedScrollingEnabled設(shè)置false宝鼓,除了需要響應(yīng)滑動(dòng)的RecyclerView。并在ViewPager2切換頁(yè)面的時(shí)候巴刻,觸發(fā)CoordinatorLayout.requestLayout()或反射修改nestedScrollingChildRef值愚铡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市胡陪,隨后出現(xiàn)的幾起案子沥寥,更是在濱河造成了極大的恐慌,老刑警劉巖柠座,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邑雅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡愚隧,警方通過(guò)查閱死者的電腦和手機(jī)蒂阱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)锻全,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人录煤,你說(shuō)我怎么就攤上這事鳄厌。” “怎么了妈踊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵了嚎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我廊营,道長(zhǎng)歪泳,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任露筒,我火速辦了婚禮呐伞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘慎式。我一直安慰自己伶氢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布瘪吏。 她就那樣靜靜地躺著癣防,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掌眠。 梳的紋絲不亂的頭發(fā)上蕾盯,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音蓝丙,去河邊找鬼级遭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛渺尘,可吹牛的內(nèi)容都是我干的装畅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沧烈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了像云?” 一聲冷哼從身側(cè)響起锌雀,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迅诬,沒(méi)想到半個(gè)月后腋逆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侈贷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年惩歉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撑蚌,死狀恐怖上遥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情争涌,我是刑警寧澤粉楚,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站亮垫,受9級(jí)特大地震影響模软,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饮潦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一燃异、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧继蜡,春花似錦回俐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至稻轨,卻和暖如春灵莲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殴俱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工政冻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人线欲。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓明场,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親李丰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苦锨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355