在 Android 應用中,同時使用側滑菜單與 ViewPager + Fragment 實現的選項卡滑動切換時,兩者的觸摸事件極易產生衝突:側滑菜單攔截了水平滑動,導致 ViewPager 無法翻頁;或 ViewPager 消費了觸摸事件,側滑菜單無法喚出。
關鍵在於觸摸事件分發機制的協調。常見方案包括:
DrawerLayout 的 onInterceptTouchEvent:在側滑菜單邊緣區域優先響應菜單,其他區域交給 ViewPager。ViewPager 的 setOnTouchListener 配合 requestDisallowInterceptTouchEvent:在 ViewPager 內部滑動時告訴父佈局「不要攔截我的事件」。SlidingMenu、NavigationView (Material Design) 等,內部已處理好衝突邏輯。詳細代碼實現可參考博客:Android 側滑菜單與 ViewPager 衝突完美解決
DrawerLayout + NavigationView,兼容性最好。ViewGroup 事件分發流程(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)。衝突不可怕,理清分發鏈路,側滑與翻頁完美共存。