2017-10-11 4 views
0

J'ai mis en place un ViewPager dans mon application qui se composent de deux diapositives. Je peux aller de first slide à second slide et inverser aussi bien. Mais j'ai un cas particulier ici. Si l'utilisateur passe de First Slide à Second Slide. Il ne devrait pas pouvoir revenir au First slide. Je dois désactiver le retour au First Slide une fois qu'il a entré le Second Slide.Comment éviter d'aller à la diapositive précédente dans Viewpager dans android

Voici mon code:

public class BotConnectionDialog extends DialogFragment { 

    private RelativeLayout toolbar; 
    private ImageView toolbarCloseButton; 
    private View layoutView; 
    private ViewPager viewPager; 
    private BotConnectionDialogAdapter myViewPagerAdapter; 
    private LinearLayout dotsLayout; 
    private TextView[] dots; 
    int width, height; 
    DisplayMetrics metrics; 
    private int[] layouts; 
    private final String TAG = BotConnectionDialog.class.getSimpleName(); 
    private Button btnSkip, btnNext; 

    View.OnClickListener myListener = new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Handler handler = new Handler(); 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        getActivity().getSupportFragmentManager().popBackStackImmediate(); 
       } 
      }); 
     } 
    }; 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.botconnection_layout, container, false); 
     Typeface typeface = Typeface.createFromAsset(getActivity().getAssets(), "fonts/corbert.otf"); 
     toolbar = (RelativeLayout) rootView.findViewById(R.id.customAppBarLayout); 
     toolbar.setBackgroundColor(Color.parseColor("#00000000")); 
     toolbarCloseButton = (ImageView) rootView.findViewById(R.id.toolbarCloseButton); 
     toolbarCloseButton.setOnClickListener(myListener); 
     viewPager = (ViewPager) rootView.findViewById(R.id.view_pager); 
     dotsLayout = (LinearLayout) rootView.findViewById(R.id.layoutDots); 
     btnSkip = (Button) rootView.findViewById(R.id.btn_skip); 
     btnSkip.setTypeface(typeface); 
     btnNext = (Button) rootView.findViewById(R.id.btn_next); 
     btnNext.setTypeface(typeface); 
     metrics = getResources().getDisplayMetrics(); 
     width = metrics.widthPixels; 
     height = metrics.heightPixels; 

     // layouts of all welcome sliders 
     // add few more layouts if you want 
     layouts = new int[]{ 
       R.layout.slide1, 
       R.layout.slide2}; 

     // adding bottom dots 
     addBottomDots(0); 

     myViewPagerAdapter = new BotConnectionDialogAdapter(); 
     viewPager.setAdapter(myViewPagerAdapter); 
     viewPager.addOnPageChangeListener(viewPagerPageChangeListener); 

     btnNext.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // checking for last page 
       // if last page home screen will be launched 
       int current = getItem(+1); 
       if (current < layouts.length) { 
        // move to next screen 
        viewPager.setCurrentItem(current); 
       } else { 

       } 
      } 
     }); 
     return rootView; 
    } 

    private void addBottomDots(int currentPage) { 
     dots = new TextView[layouts.length]; 

     int[] colorsActive = getResources().getIntArray(R.array.array_dot_active); 
     int[] colorsInactive = getResources().getIntArray(R.array.array_dot_inactive); 

     dotsLayout.removeAllViews(); 
     for (int i = 0; i < dots.length; i++) { 
      dots[i] = new TextView(getActivity()); 
      dots[i].setText(Html.fromHtml("&#8226;")); 
      dots[i].setTextSize(35); 
      dots[i].setTextColor(colorsInactive[currentPage]); 
      dotsLayout.addView(dots[i]); 
     } 

     if (dots.length > 0) 
      dots[currentPage].setTextColor(colorsActive[currentPage]); 
    } 

    private int getItem(int i) { 
     return viewPager.getCurrentItem() + i; 
    } 


    // viewpager change listener 
    ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() { 

     @Override 
     public void onPageSelected(int position) { 
      addBottomDots(position); 

      // changing the next button text 'NEXT'/'GOT IT' 
      if (position == layouts.length - 1) { 
       // last page. make button text to GOT IT 
       btnNext.setText(getString(R.string.start)); 
       btnSkip.setVisibility(View.GONE); 
       /** 
       * bluetooth connection the bot 
       */ 
       Toast.makeText(getActivity(), "Finished", Toast.LENGTH_SHORT).show(); 
      } else { 
       // still pages are left 
       btnNext.setText(getString(R.string.next)); 
       btnSkip.setVisibility(View.VISIBLE); 
       /** 
       * First page 
       */ 
       Toast.makeText(getActivity(), "2nd page", Toast.LENGTH_SHORT).show(); 
      } 
     } 

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

     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 

     } 
    }; 


    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Dialog dialog = super.onCreateDialog(savedInstanceState); 
     //dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
     dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
     return dialog; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
//  getDialog().getWindow().setLayout((7 * width)/7, (4 * height)/5); 
    } 

    public class BotConnectionDialogAdapter extends PagerAdapter { 
     /** 
     * View pager adapter 
     */ 
     private LayoutInflater layoutInflater; 

     public BotConnectionDialogAdapter() { 
     } 

     @Override 
     public Object instantiateItem(ViewGroup container, int position) { 
      layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      View view = layoutInflater.inflate(layouts[position], container, false); 
      container.addView(view); 
      return view; 
     } 

     @Override 
     public int getCount() { 
      return layouts.length; 
     } 

     @Override 
     public boolean isViewFromObject(View view, Object obj) { 
      return view == obj; 
     } 


     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) { 
      View view = (View) object; 
      container.removeView(view); 
     } 

    } 

} 
+1

https://stackoverflow.com/questions/18660011/viewpager-disable-swiping-to-a-certain-direction –

+1

J'ai essayé cette solution. J'ai mis à jour le 'layouts array' avec une seule diapositive ' layouts = new int [] {R.layout.slide2}; 'inside' onPageSelected', puis appelé 'notifyDataSetChanged()' après cela. Mais alors je suis capable de revenir en arrière et de ne pas pouvoir passer à la diapositive suivante. – XoXo

+1

https://stackoverflow.com/questions/19602369/how-to-disable-viewpager-from-swiping-in-one-direction –

Répondre

1
/** 
* To disable and enable scrolling on ViewPager, just set shouldScroll to true or false. 
*/ 

public class ScrollableViewPager extends ViewPager { 

    private boolean shouldScroll = true; 

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

    public void setShouldScroll(boolean shouldScroll) { 
     this.shouldScroll = shouldScroll; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     return shouldScroll && super.onTouchEvent(ev); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     return shouldScroll && super.onInterceptTouchEvent(ev); 
    } 
} 

utiliser maintenant ce ScrollableViewPager à la place de la valeur par défaut ViewPager et dans votre rappel chèque de la position onPageSelected(). Si elle est la dernière position, appelez le setShouldScroll (false) méthode sur votre instance viewPager, qui fera shouldScroll false dans notre classe ScrollableViewPager et éventuellement faire le défilement invalide comme nous l'avons substituée onTouchEvent() et La méthode onInterceptTouchEvent(), qui vérifie la valeur de shouldScroll.