0

私は3つのフラグメントを持つビューページャを持っています。私がビューページャの最後のページを超えてスクロールした場合、私はトーストを表示するか、「利用可能なページがありません」というアラートを表示する必要があります。アラートを表示する方法ViewPagerが最後のページを超えてスクロールされた場合

私は多くを試みたが、何も助けなかった。

どんな助力もありがとうございます。

は、私は、コードスニペットは親切にそれを通過追加した

ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() { 
     boolean callHappened; 
     int selectedIndex; 
     boolean mPageEnd; 
    @Override 
    public void onPageSelected(int position) { 
     selectedIndex = position; 
    } 

    @Override 
    public void onPageScrolled(int arg0, float arg1, int arg2) { 
     // TODO Auto-generated method stub 

     if(mPageEnd && arg0 == myViewPagerAdapter.getCount()-1 && !callHappened){ 
      Log.d(getClass().getName(), "Okay"); 
      mPageEnd = false;//To avoid multiple calls. 
      callHappened = true; 
     }else{ 
      mPageEnd = false; 
     } 
    } 
    @Override 
    public void onPageScrollStateChanged(int arg0) { 
     // TODO Auto-generated method stub 
     if(selectedIndex == myViewPagerAdapter.getCount() - 1) 
     { 
      mPageEnd = true; 
     } 
    } 
}; 

答えて

1

あなたのレイアウトXMLでビューページャ用

public class CustomViewPagerEndSwipe extends ViewPager { 

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

    float mStartDragX; 
    OnSwipeOutListener mListener; 


    public void setOnSwipeOutListener(OnSwipeOutListener listener) { 
     mListener = listener; 
    } 


    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     float x = ev.getX(); 
     switch (ev.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      mStartDragX = x; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if (mStartDragX < x && getCurrentItem() == 0) { 
       mListener.onSwipeOutAtStart(); 
      } else if (mStartDragX > x && getCurrentItem() == getAdapter().getCount() - 1) { 
       mListener.onSwipeOutAtEnd(); 
      } 
      break; 
     } 
     return super.onInterceptTouchEvent(ev); 
    } 

    public interface OnSwipeOutListener { 
     public void onSwipeOutAtStart(); 
     public void onSwipeOutAtEnd(); 
    } 
} 

使用このクラスをカスタムビューページャクラスを作成してみてください

<com.utils.customview.CustomViewPagerEndSwipe 
      android:id="@+id/viewPager" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      /> 

あなたのアクティビティとフラグメントのリスナーを実装すると、最後のページのトーストが得られます。それは、あなたは、ビューページャの最後の項目であるfalseを返す場合、インタフェース

viewPager.setOnSwipeOutListener(this); 
+1

このソリューションは完全に機能します。開発者にクドゥス。 –

+0

ありがとう、コーディングをしてください.. –

+0

素晴らしいです。ありがとうございます –

0

からあなたはviewpager.canScrollHorizontally(View.SCROLL_AXIS_HORIZONTAL)の方法で確認することができます。

+0

このコードは、私がビューページャーの最後のページに達したときに動作しています。私は最後のページの後にスワイプする必要があります。 –

1

@Mohit Sutharのコードと元のコードの一部のコードを使用していますが、@ Mohit Sutharの答えでは、ユーザーが最初のページの前にスワイプすると警告が表示されます複数の呼び出しを避けるために質問者のコード "callHappened"変数)

次のコードは、ユーザーがフラグメントの上部領域で左にスワイプすると完全な作業を提供しません。変更を待つ

そして、別のカスタムロジックを持っていると柔軟になるため、スワイプされたアクションにenumを使用することを提案しました。

public class CustomViewPagerEndSwipe extends ViewPager { 
    public CustomViewPagerEndSwipe(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    float mStartDragX; 
    SwipeAction mSwipeAction; 
    OnSwipeOutListener mListener; 
    boolean callHappened = false; 
    public void setOnSwipeOutListener(OnSwipeOutListener listener) { 
     mListener = listener; 
    } 
    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     float x = ev.getX(); 
     switch (ev.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       mStartDragX = x; 
       callHappened = false; 
       break; 
      case MotionEvent.ACTION_MOVE: 
       if (!callHappened) { 
        if (mStartDragX < x && getCurrentItem() == 0) { 
         mSwipeAction = SwipeAction.BEFORE_START_PAGE; 
         mListener.onSwipe(mSwipeAction); 
         callHappened = true; 
        } else if (mStartDragX > x && getCurrentItem() == getAdapter().getCount() - 1) { 
         mSwipeAction = SwipeAction.AFTER_LAST_PAGE; 
         mListener.onSwipe(mSwipeAction); 
         callHappened = true; 
        } 
       } 
       break; 
     } 
     return super.onInterceptTouchEvent(ev); 
    } 
    public enum SwipeAction { 
     BEFORE_START_PAGE, AFTER_LAST_PAGE 
    } 
    public interface OnSwipeOutListener { 
     void onSwipe(SwipeAction pSwipeAction); 
    } 
} 

あなたの活動に呼び出すコード/フラグメント@Mohit Sutharの答えから更新

viewPager.setOnSwipeOutListener(new CustomViewPagerEndSwipe.OnSwipeOutListener() { 
    @Override 
    public void onSwipe(CustomViewPagerEndSwipe.SwipeAction pSwipeAction) { 
     switch (pSwipeAction) { 
      case BEFORE_START_PAGE: 
       new AlertDialog.Builder(getActivity()).setMessage("Swipe out start").create().show(); 
       break; 
      case AFTER_LAST_PAGE: 
       new AlertDialog.Builder(getActivity()).setMessage("Swipe out end").create().show(); 
       break; 
     } 
    } 
}); 
+0

この回答は受け入れられるものです。 –

+0

私の説明をご覧ください。 –

0

。私の場合、私はトーストを使用し、私はあまり敏感でなく、少ししか発生したくないと思っています。

private final static long TIME_MS = 2000; 
private final static long THRESHOLD = 50; 

OnSwipeOutListener mListener; 
float mStartDragX; 

private boolean activated = false; 
private Timer mTimer; 
private TimerTask mTimerTask; 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    float x = ev.getX(); 
    switch (ev.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      mStartDragX = x; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      Log.JSC("TEST", "1 : " + (mStartDragX < x - 20 && getCurrentItem() == 0)); 
      Log.JSC("TEST", "2 : " + (activated)); 
      Log.JSC("TEST", "3 : " + mStartDragX); 
      Log.JSC("TEST", "4 : " + x); 
      Log.JSC("TEST", "5 : " + (x - 20)); 

      if (mStartDragX < x - THRESHOLD && getCurrentItem() == 0) { 
       if (!activated) { 
        activated = true; 
        prepareTimer(); 
        mTimer.schedule(mTimerTask, TIME_MS); 
        if (mListener != null) { 
         mListener.onSwipeOutAtStart(); 
        } 
       } 
      } else if (mStartDragX - THRESHOLD > x && getCurrentItem() == getAdapter().getCount() - 1) { 
       if (!activated) { 
        activated = true; 
        prepareTimer(); 
        mTimer.schedule(mTimerTask, TIME_MS); 
        if (mListener != null) { 
         mListener.onSwipeOutAtEnd(); 
        } 
       } 
      } 
      break; 
    } 
    try { 
     return super.onInterceptTouchEvent(ev); 
    } catch (IllegalArgumentException e) { 
     return false; 
    } 
} 

private void prepareTimer() { 
    mTimer = new Timer(); 
    mTimerTask = new TimerTask() { 
     @Override 
     public void run() { 
      activated = false; 
     } 
    }; 
} 
関連する問題