2014-03-19 81 views
0

在我的應用程序中我有一個ViewPager和兩個Sliding菜單,我的ViewPager延伸Fragment,我要實現的是:在我的左滑動菜單中有一些按鈕,單擊每個這些按鈕的我​​想看到的特定頁面ViewPager但我不是能夠實現它如何獲得ViewPager的特定頁面,而它擴展片段

這是我ViewPageFragment類:

public class ViewPageFragment extends Fragment { 

private ImageView showLeft; 
private ImageView showRight; 
private MyAdapter mAdapter; 
private ViewPager mPager; 
private ArrayList<Fragment> pagerItemList = new ArrayList<Fragment>(); 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 


    View mView = inflater.inflate(R.layout.view_pager, null); 
    showLeft = (ImageView) mView.findViewById(R.id.showLeft); 
    showRight = (ImageView) mView.findViewById(R.id.showRight); 
    mPager = (ViewPager) mView.findViewById(R.id.pager); 
    PageFragment1 page1 = new PageFragment1(); 
    PageFragment2 page2 = new PageFragment2(); 
    PageFragment3 page3 = new PageFragment3(); 
    PageFragment4 page4 = new PageFragment4(); 
    pagerItemList.add(page1); 
    pagerItemList.add(page2); 
    pagerItemList.add(page3); 
    pagerItemList.add(page4); 
    mAdapter = new MyAdapter(getFragmentManager()); 
    mPager.setAdapter(mAdapter); 
    mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     // @Override 
     public void onPageSelected(int position) { 

      if (myPageChangeListener != null) 
       myPageChangeListener.onPageSelected(position); 

     } 

     // @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 

     } 

     // @Override 
     public void onPageScrollStateChanged(int position) { 

     } 
    }); 

    return mView; 
} 

public void onActivityCreated(Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    showLeft.setOnClickListener(new OnClickListener() { 

     // @Override 
     public void onClick(View v) { 
      ((SlidingActivity) getActivity()).showLeft(); 
     } 
    }); 

    showRight.setOnClickListener(new OnClickListener() { 

     // @Override 
     public void onClick(View v) { 
      ((SlidingActivity) getActivity()).showRight(); 
     } 
    }); 
} 

public boolean isFirst() { 
    if (mPager.getCurrentItem() == 0) 
     return true; 
    else 
     return false; 
} 

public boolean isEnd() { 
    if (mPager.getCurrentItem() == pagerItemList.size() - 1) 
     return true; 
    else 
     return false; 
} 

public class MyAdapter extends FragmentPagerAdapter { 
    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return pagerItemList.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 

     Fragment fragment = null; 
     if (position < pagerItemList.size()) 
      fragment = pagerItemList.get(position); 
     else 
      fragment = pagerItemList.get(0); 

     return fragment; 

    } 
} 

private MyPageChangeListener myPageChangeListener; 

public void setMyPageChangeListener(MyPageChangeListener l) { 

    myPageChangeListener = l; 

} 

public interface MyPageChangeListener { 
    public void onPageSelected(int position); 
} 

} 

這是我SlidingMenu類:

public class SlidingMenu extends RelativeLayout { 

private View mSlidingView; 
private View mMenuView; 
private View mDetailView; 
private RelativeLayout bgShade; 
private int screenWidth; 
private int screenHeight; 
private Context mContext; 
private Scroller mScroller; 
private VelocityTracker mVelocityTracker; 
private int mTouchSlop; 
private float mLastMotionX; 
private float mLastMotionY; 
private static final int VELOCITY = 50; 
private boolean mIsBeingDragged = true; 
private boolean tCanSlideLeft = true; 
private boolean tCanSlideRight = false; 
private boolean hasClickLeft = false; 
private boolean hasClickRight = false; 

public SlidingMenu(Context context) { 
    super(context); 
    init(context); 
} 

private void init(Context context) { 

    mContext = context; 
    bgShade = new RelativeLayout(context); 
    mScroller = new Scroller(getContext()); 
    mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); 
    WindowManager windowManager = ((Activity) context).getWindow() 
      .getWindowManager(); 
    Display display = windowManager.getDefaultDisplay(); 
    screenWidth = display.getWidth(); 
    screenHeight = display.getHeight(); 
    LayoutParams bgParams = new LayoutParams(screenWidth, screenHeight); 
    bgParams.addRule(RelativeLayout.CENTER_IN_PARENT); 
    bgShade.setLayoutParams(bgParams); 

} 

public SlidingMenu(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context); 
} 

public SlidingMenu(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(context); 
} 

public void addViews(View left, View center, View right) { 
    setLeftView(left); 
    setRightView(right); 
    setCenterView(center); 
} 

public void setLeftView(View view) { 
    LayoutParams behindParams = new LayoutParams(LayoutParams.WRAP_CONTENT, 
      LayoutParams.FILL_PARENT); 
    addView(view, behindParams); 
    mMenuView = view; 
} 

public void setRightView(View view) { 
    LayoutParams behindParams = new LayoutParams(LayoutParams.WRAP_CONTENT, 
      LayoutParams.FILL_PARENT); 
    behindParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
    addView(view, behindParams); 
    mDetailView = view; 
} 

public void setCenterView(View view) { 
    LayoutParams aboveParams = new LayoutParams(LayoutParams.FILL_PARENT, 
      LayoutParams.FILL_PARENT); 

    LayoutParams bgParams = new LayoutParams(screenWidth, screenHeight); 
    bgParams.addRule(RelativeLayout.CENTER_IN_PARENT); 

    View bgShadeContent = new View(mContext); 
    bgShadeContent.setBackgroundDrawable(getResources().getDrawable(
      R.drawable.shade_bg)); 
    bgShade.addView(bgShadeContent, bgParams); 

    addView(bgShade, bgParams); 

    addView(view, aboveParams); 
    mSlidingView = view; 
    mSlidingView.bringToFront(); 
} 

@Override 
public void scrollTo(int x, int y) { 
    super.scrollTo(x, y); 
    postInvalidate(); 
} 

@Override 
public void computeScroll() { 
    if (!mScroller.isFinished()) { 
     if (mScroller.computeScrollOffset()) { 
      int oldX = mSlidingView.getScrollX(); 
      int oldY = mSlidingView.getScrollY(); 
      int x = mScroller.getCurrX(); 
      int y = mScroller.getCurrY(); 
      if (oldX != x || oldY != y) { 
       if (mSlidingView != null) { 
        mSlidingView.scrollTo(x, y); 
        if (x < 0) 
         bgShade.scrollTo(x + 20, y);// 背景阴影�� 
        else 
         bgShade.scrollTo(x - 20, y);// 背景阴影左� 
       } 
      } 
      invalidate(); 
     } 
    } 
} 

private boolean canSlideLeft = true; 
private boolean canSlideRight = false; 

public void setCanSliding(boolean left, boolean right) { 
    canSlideLeft = left; 
    canSlideRight = right; 
} 


/*拦截touch事件*/ 
@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 

    final int action = ev.getAction(); 
    final float x = ev.getX(); 
    final float y = ev.getY(); 
    switch (action) { 
    case MotionEvent.ACTION_DOWN: 
     mLastMotionX = x; 
     mLastMotionY = y; 
     mIsBeingDragged = false; 
     if (canSlideLeft) { 
      mMenuView.setVisibility(View.VISIBLE); 
      mDetailView.setVisibility(View.INVISIBLE); 
     } 
     if (canSlideRight) { 
      mMenuView.setVisibility(View.INVISIBLE); 
      mDetailView.setVisibility(View.VISIBLE); 
     } 
     break; 

    case MotionEvent.ACTION_MOVE: 
     final float dx = x - mLastMotionX; 
     final float xDiff = Math.abs(dx); 
     final float yDiff = Math.abs(y - mLastMotionY); 
     if (xDiff > mTouchSlop && xDiff > yDiff) { 
      if (canSlideLeft) { 
       float oldScrollX = mSlidingView.getScrollX(); 
       if (oldScrollX < 0) { 
        mIsBeingDragged = true; 
        mLastMotionX = x; 
       } else { 
        if (dx > 0) { 
         mIsBeingDragged = true; 
         mLastMotionX = x; 
        } 
       } 

      } else if (canSlideRight) { 
       float oldScrollX = mSlidingView.getScrollX(); 
       if (oldScrollX > 0) { 
        mIsBeingDragged = true; 
        mLastMotionX = x; 
       } else { 
        if (dx < 0) { 
         mIsBeingDragged = true; 
         mLastMotionX = x; 
        } 
       } 
      } 

     } 
     break; 

    } 
    return mIsBeingDragged; 
} 

/*处�拦截�的touch事件*/ 
@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    if (mVelocityTracker == null) { 
     mVelocityTracker = VelocityTracker.obtain(); 
    } 
    mVelocityTracker.addMovement(ev); 

    final int action = ev.getAction(); 
    final float x = ev.getX(); 
    final float y = ev.getY(); 

    switch (action) { 
    case MotionEvent.ACTION_DOWN: 
     if (!mScroller.isFinished()) { 
      mScroller.abortAnimation(); 
     } 
     mLastMotionX = x; 
     mLastMotionY = y; 
     if (mSlidingView.getScrollX() == -getMenuViewWidth() 
       && mLastMotionX < getMenuViewWidth()) { 
      return false; 
     } 

     if (mSlidingView.getScrollX() == getDetailViewWidth() 
       && mLastMotionX > getMenuViewWidth()) { 
      return false; 
     } 

     break; 
    case MotionEvent.ACTION_MOVE: 
     if (mIsBeingDragged) { 
      final float deltaX = mLastMotionX - x; 
      mLastMotionX = x; 
      float oldScrollX = mSlidingView.getScrollX(); 
      float scrollX = oldScrollX + deltaX; 
      if (canSlideLeft) { 
       if (scrollX > 0) 
        scrollX = 0; 
      } 
      if (canSlideRight) { 
       if (scrollX < 0) 
        scrollX = 0; 
      } 
      if (deltaX < 0 && oldScrollX < 0) { // left view 
       final float leftBound = 0; 
       final float rightBound = -getMenuViewWidth(); 
       if (scrollX > leftBound) { 
        scrollX = leftBound; 
       } else if (scrollX < rightBound) { 
        scrollX = rightBound; 
       } 
      } else if (deltaX > 0 && oldScrollX > 0) { // right view 
       final float rightBound = getDetailViewWidth(); 
       final float leftBound = 0; 
       if (scrollX < leftBound) { 
        scrollX = leftBound; 
       } else if (scrollX > rightBound) { 
        scrollX = rightBound; 
       } 
      } 
      if (mSlidingView != null) { 
       mSlidingView.scrollTo((int) scrollX, 
         mSlidingView.getScrollY()); 
       if (scrollX < 0) 
        bgShade.scrollTo((int) scrollX + 20, 
          mSlidingView.getScrollY()); 
       else 
        bgShade.scrollTo((int) scrollX - 20, 
          mSlidingView.getScrollY()); 
      } 

     } 
     break; 
    case MotionEvent.ACTION_CANCEL: 
    case MotionEvent.ACTION_UP: 
     if (mIsBeingDragged) { 
      final VelocityTracker velocityTracker = mVelocityTracker; 
      velocityTracker.computeCurrentVelocity(100); 
      float xVelocity = velocityTracker.getXVelocity(); 
      int oldScrollX = mSlidingView.getScrollX(); 
      int dx = 0; 
      if (oldScrollX <= 0 && canSlideLeft) {// left view 
       if (xVelocity > VELOCITY) { 
        dx = -getMenuViewWidth() - oldScrollX; 
       } else if (xVelocity < -VELOCITY) { 
        dx = -oldScrollX; 
        if (hasClickLeft) { 
         hasClickLeft = false; 
         setCanSliding(tCanSlideLeft, tCanSlideRight); 
        } 
       } else if (oldScrollX < -getMenuViewWidth()/2) { 
        dx = -getMenuViewWidth() - oldScrollX; 
       } else if (oldScrollX >= -getMenuViewWidth()/2) { 
        dx = -oldScrollX; 
        if (hasClickLeft) { 
         hasClickLeft = false; 
         setCanSliding(tCanSlideLeft, tCanSlideRight); 
        } 
       } 

      } 
      if (oldScrollX >= 0 && canSlideRight) { 
       if (xVelocity < -VELOCITY) { 
        dx = getDetailViewWidth() - oldScrollX; 
       } else if (xVelocity > VELOCITY) { 
        dx = -oldScrollX; 
        if (hasClickRight) { 
         hasClickRight = false; 
         setCanSliding(tCanSlideLeft, tCanSlideRight); 
        } 
       } else if (oldScrollX > getDetailViewWidth()/2) { 
        dx = getDetailViewWidth() - oldScrollX; 
       } else if (oldScrollX <= getDetailViewWidth()/2) { 
        dx = -oldScrollX; 
        if (hasClickRight) { 
         hasClickRight = false; 
         setCanSliding(tCanSlideLeft, tCanSlideRight); 
        } 
       } 
      } 

      smoothScrollTo(dx); 

     } 

     break; 
    } 

    return true; 
} 

private int getMenuViewWidth() { 
    if (mMenuView == null) { 
     return 0; 
    } 
    return mMenuView.getWidth(); 
} 

private int getDetailViewWidth() { 
    if (mDetailView == null) { 
     return 0; 
    } 
    return mDetailView.getWidth(); 
} 

void smoothScrollTo(int dx) { 
    int duration = 500; 
    int oldScrollX = mSlidingView.getScrollX(); 
    mScroller.startScroll(oldScrollX, mSlidingView.getScrollY(), dx, 
      mSlidingView.getScrollY(), duration); 
    invalidate(); 
} 

public void showLeftView() { 
    int menuWidth = mMenuView.getWidth(); 
    int oldScrollX = mSlidingView.getScrollX(); 
    if (oldScrollX == 0) { 
     mMenuView.setVisibility(View.VISIBLE); 
     mDetailView.setVisibility(View.INVISIBLE); 
     smoothScrollTo(-menuWidth); 
     tCanSlideLeft = canSlideLeft; 
     tCanSlideRight = canSlideRight; 
     hasClickLeft = true; 
     setCanSliding(true, false); 
    } else if (oldScrollX == -menuWidth) { 
     smoothScrollTo(menuWidth); 
     if (hasClickLeft) { 
      hasClickLeft = false; 
      setCanSliding(tCanSlideLeft, tCanSlideRight); 
     } 
    } 
} 
public void showRightView() { 
    int menuWidth = mDetailView.getWidth(); 
    int oldScrollX = mSlidingView.getScrollX(); 
    if (oldScrollX == 0) { 
     mMenuView.setVisibility(View.INVISIBLE); 
     mDetailView.setVisibility(View.VISIBLE); 
     smoothScrollTo(menuWidth); 
     tCanSlideLeft = canSlideLeft; 
     tCanSlideRight = canSlideRight; 
     hasClickRight = true; 
     setCanSliding(false, true); 
    } else if (oldScrollX == menuWidth) { 
     smoothScrollTo(-menuWidth); 
     if (hasClickRight) { 
      hasClickRight = false; 
      setCanSliding(tCanSlideLeft, tCanSlideRight); 
     } 
    } 
} 

} 

這是這關係到我的左邊滑動菜單我LeftFragment類:

public class LeftFragment extends Fragment { 
private ArrayList<Fragment> pagerItemList = new ArrayList<Fragment>(); 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 

{ 

    if (container == null) { 

     return null; 
    } 

    LinearLayout left_menu_list = (LinearLayout) inflater.inflate(
      R.layout.left, container, false); 

    LinearLayout leftMenuItem3 = (LinearLayout) left_menu_list 
      .findViewById(R.id.left_menu_item3); 
    leftMenuItem3.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      Log.i("SAHAR click", "I SHOULD DO SOMETHING HERE "); 

     } 
    }); 

    return left_menu_list; 
} 

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
} 

} 

,這是我的頁面片段之一的例子:

public class PageFragment3 extends Fragment { 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.page3, null); 
    return view; 
} 

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
} 

} 

回答

1

您可以使用下面的方法來選擇具體頁面。

viewPager.setCurrentItem(position); 

這裏position

頁面的索引
相關問題