看看我的解決方案github。
如果由於某種原因鏈接被刪除,我會解釋我做了什麼。
- 我將相關的Snackbar類複製到我的項目中。
- 受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;
}
}
我遇到了同樣的問題,另外,如果我滾動左/右的小吃吧滾出頁面。我不知道這是否會幫助你給出你的場景,但是我最終做的是將快餐欄放在有viewpager的佈局中,而不是內部片段的佈局。然後我發回了一個消息給拿着視圖尋呼機的片段,並從那裏發起了快餐欄。我現在可以解除它,它不會與尋呼機滾動,這正是我想要的。希望有所幫助! – Ben987654
謝謝。我最初嘗試了這種方法,但我試圖在ViewPager中保留它所屬的片段。如果用戶在ViewPager中滑動片段,我想讓快餐欄與片段一起滑動。 – GFred