首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android SlidingMenu 與 ListView 滑動衝突解決方案

     編輯:程式設計疑難解答

現象:側滑菜單打開後,主界面 ListView 無法滑動。根因是觸摸事件分發機制:SlidingMenu 攔截了觸摸事件,導致 ListView 的 onTouchEvent 不再接收到 ACTION_MOVE。

核心解決思路

  1. 請求父視圖攔截權:在 ListView 的 onTouchEvent 中,ACTION_DOWN 時調用 getParent().requestDisallowInterceptTouchEvent(true),告訴 SlidingMenu「這次滑動歸我管」
  2. 判斷滑動方向:僅當水平滑動幅度大於垂直時,才讓 SlidingMenu 響應;垂直滑動時 ListView 獨享事件

代碼片段

public class MyListView extends ListView {
    private float xDown, yDown;

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                xDown = ev.getX(); yDown = ev.getY();
                getParent().requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_MOVE:
                float dx = Math.abs(ev.getX() - xDown);
                float dy = Math.abs(ev.getY() - yDown);
                if (dx > dy) { // 水平滑動,交給 SlidingMenu
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }
}

替代方案

  • 使用 DrawerLayout (官方組件) 替代 SlidingMenu,原生支持嵌套滑動
  • 升級到 RecyclerView + ItemTouchHelper,更靈活
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved