2015-11-03 36 views
2

範圍Viewpager攔截小吃吧解僱

我有一個包含ViewPager片段。 viewpager的每個頁面都包含一個項目片段。當我對物品片段採取行動時,我會在物品片段中顯示一個小吃棒。快餐欄是項目片段的一部分(CoordinatorLayout是項目片段佈局的一部分)。

問題

我現在面臨的問題是,我是不允許的,因爲viewpager攔截刷卡事件並更改頁面,而不是讓小吃吧獲得駁回駁回小吃吧。

問題

我想viewpager不攔截倒是小吃吧,但還是攔截倒是項目片段的剩餘部分(用戶應該還是可以左右滑動來翻頁不刷卡時在小吃店)。有誰知道一種方法來做到這一點?

我已經創建了一個示例應用程序來演示該問題。它可在https://github.com/gfrederick/ViewPagerSnackbar

+0

我遇到了同樣的問題,另外,如果我滾動左/右的小吃吧滾出頁面。我不知道這是否會幫助你給出你的場景,但是我最終做的是將快餐欄放在有viewpager的佈局中,而不是內部片段的佈局。然後我發回了一個消息給拿着視圖尋呼機的片段,並從那裏發起了快餐欄。我現在可以解除它,它不會與尋呼機滾動,這正是我想要的。希望有所幫助! – Ben987654

+0

謝謝。我最初嘗試了這種方法,但我試圖在ViewPager中保留它所屬的片段。如果用戶在ViewPager中滑動片段,我想讓快餐欄與片段一起滑動。 – GFred

回答

2

看看我的解決方案github

如果由於某種原因鏈接被刪除,我會解釋我做了什麼。

  1. 我將相關的Snackbar類複製到我的項目中。
  2. this answer的啓發,我修改了Snackbar的Behavior子類以在viewpager中工作。具體來說,我發現視圖層次結構中是否有viewpager作爲快餐欄的父級。然後,當觸摸小吃店時,我禁用該視圖頁面處理觸摸事件。當放開小吃店時(觸摸事件結束時),我可以重新啓用它。

這裏的重要代碼:

final class Behavior extends SwipeDismissBehavior<SnackbarLayout> { 

    @Override 
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, SnackbarLayout child, 
             MotionEvent event) { 

     ViewPager vp = getViewPagerParent(child); 

     if (parent.isPointInChildBounds(child, (int) event.getX(), (int) event.getY())) { 
      switch (event.getActionMasked()) { 
       case MotionEvent.ACTION_DOWN: 
        ViewPagerSnackbarManager.getInstance().cancelTimeout(mManagerCallback); 

        // If touching Snackbar tell the viewpager not to intercept touch events 
        if (vp != null) { 
         vp.requestDisallowInterceptTouchEvent(true); 
        } 
        break; 
       case MotionEvent.ACTION_UP: 
       case MotionEvent.ACTION_CANCEL: 
        // As soon as this event (touching the Snackbar) is over tell viewpager to resume intercepting touch events 
        if (vp != null) { 
         vp.requestDisallowInterceptTouchEvent(false); 
        } 
        ViewPagerSnackbarManager.getInstance().restoreTimeout(mManagerCallback); 
        break; 
      } 
     } 
     return super.onInterceptTouchEvent(parent, child, event); 
    } 

    // helper method that move up the view hierarchy searching for a Viewpager and returns it if found. Null if not found. 
    private ViewPager getViewPagerParent(View child) { 
     ViewParent parent = child.getParent(); 

     while (parent != null) { 
      parent = child.getParent(); 
      if (parent instanceof ViewPager) { 
       return (ViewPager) parent; 
      } else if (!(parent instanceof View)) { 
       return null; 
      } else { 
       child = (View) parent; 
      } 
     } 
     return null; 
    } 
} 
+0

完美地工作。謝謝! – GFred

+0

Np。我用android打開了一個[bug](https://code.google.com/p/android/issues/detail?id=198230)。 – MidasLefko