1. 程式人生 > >viewpager+fragment+viewpager+scrollview滑動衝突問題

viewpager+fragment+viewpager+scrollview滑動衝突問題

我的佈局比較複雜,viewpager裡面是fragment,fragment裡面有事viewpager,viewpager裡面有事fragment,fragment裡面是scrollview,scrollview裡面是viewpager和listview不要問我為什麼這麼複雜,想想就蛋疼。。。
在這裡面能滑動的有viewpager和scrollview,那麼當我們滑動的時候到底哪個滑動,這是個問題,這裡解決的是裡層viewpager滑動時,外層viewpager和scrollview不滑動(其實scrollview影響不大,但是不禁止的話,viewpager左右滑動的時候稍微有一點上下動,就會出發scrollview的滑動,從而viewpager的左右滑動就失敗啦。所以把scrollview也禁止啦),解決辦法就是自定義一個viewpager
程式碼如下:

package com.mydrivernews.tools;

import android.content.Context;
import android.graphics.PointF;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewParent;

public class ImageViewPager extends
ViewPager {
public ImageViewPager(Context arg0, AttributeSet arg1) { super(arg0, arg1); } public ImageViewPager(Context context) { super(context); // TODO Auto-generated constructor stub } PointF downPoint = new PointF(); OnSingleTouchListener onSingleTouchListener; @Override
public boolean onTouchEvent(MotionEvent evt) { /** *這裡是我的佈局結構,每次getParent()就得到他外邊的佈局,scrollview或viwepager和這個viewpager直接有幾層佈局,就用幾個getParent() **/ ViewParent p=getParent().getParent().getParent(); //外層的viewpager取消攔截 ViewParent p2=getParent().getParent().getParent().getParent().getParent(); switch (evt.getAction()) { case MotionEvent.ACTION_DOWN: // 記錄按下時候的座標 downPoint.x = evt.getX(); downPoint.y = evt.getY(); if (this.getChildCount() > 1) { // 有內容,多於1個時 // 通知其父控制元件,現在進行的是本控制元件的操作,不允許攔截 p.requestDisallowInterceptTouchEvent(true); p2.requestDisallowInterceptTouchEvent(true); } break; case MotionEvent.ACTION_MOVE: if (this.getChildCount() > 1) { // 有內容,多於1個時 // 通知其父控制元件,現在進行的是本控制元件的操作,不允許攔截 p.requestDisallowInterceptTouchEvent(true); p2.requestDisallowInterceptTouchEvent(true); } break; case MotionEvent.ACTION_UP: // 在up時判斷是否按下和鬆手的座標為一個點 if (PointF.length(evt.getX() - downPoint.x, evt.getY() - downPoint.y) < (float) 5.0) { onSingleTouch(this); return true; } break; } return super.onTouchEvent(evt); } public void onSingleTouch(View v) { if (onSingleTouchListener != null) { onSingleTouchListener.onSingleTouch(v); } } public interface OnSingleTouchListener { public void onSingleTouch(View v); } public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) { this.onSingleTouchListener = onSingleTouchListener; } }