web-dev-qa-db-fra.com

Android ViewPager Prev / Next Button

D'accord, je développe donc une application Android qui utilise un ViewPager pour afficher les pages.

Dans chaque page, j'ai un ensemble de boutons à utiliser pour naviguer entre les pages (en plus du glissement entre les pages). Ces boutons sont pour "première page", "page précédente", "page suivante" et "dernière page".

Ce que je ne peux pas comprendre, c'est concevoir un mécanisme pour permettre un changement de page sur un clic de bouton.

Quelqu'un a des idées?

ETA: pour mieux expliquer la configuration, les boutons sont déclarés dans la mise en page de chaque page et sont gonflés avec le reste de la mise en page dans le PagerAdapter. Mon problème est que je ne peux pas référencer le ViewPager à partir du PagerAdapter. Ou du moins, je ne peux pas penser à un moyen de le faire.

41
Yoda

Bouton:

Button yourButton = (Button)findViewById(R.id.button1);
    yourButton.setOnClickListener(new OnClickListener() {

     @Override
           public void onClick(View view) {
               mViewPager.setCurrentItem(getItem(+1), true); //getItem(-1) for previous
           }
        });

Une fonction:

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

J'espère que cela t'aides :)

96
sweggersen
yourButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View view) {
      yourViewPager.setCurrentItem(page, smoothScroll);
   }
});
44
Alex Orlov

J'ai terminé ce projet avec ce code.

vPager = (ViewPager) findViewById(R.id.viewpager);
    View tempView1 = inflater.inflate(R.layout.ani_dialog1, null);
    firstView = (ImageView) tempView1.findViewById(R.id.ani_dialog_next);
    views.add(tempView1);
    firstView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            vPager.setCurrentItem(1, true);

        }
    }); 
3
Mr king from Japan

Une mise à niveau infaillible vers sweggersen's et Alex Orlov's answer,

// For scrolling to next item
nextPageButton.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        viewPager.setCurrentItem(getNextPossibleItemIndex(1), true);
    }
});

// For scrolling to previous item
previousPageButton.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        viewPager.setCurrentItem(getNextPossibleItemIndex(-1), true);
    }
});

Ajoutez la méthode getNextPossibleItemIndex () dans votre activité/fragment,

private int getNextPossibleItemIndex (int change) {

    int currentIndex = viewPager.getCurrentItem();
    int total = viewPager.getAdapter().getCount();

    if (currIndex + change < 0) {
        return 0;
    }

    return Math.abs((currentIndex + change) % total) ;
}

De cette façon, vous pourrez changer currentItem sans vous soucier de IndexOutOfBoundsException comme suggéré par le commentaire de Heinrich . Notez qu'en utilisant cette méthode, les éléments seront affichés comme une liste circulaire.

1 -> 2 -> 3 -> 1 -> 2 -> 3 -> 1

Mais en revenant, ça s'arrêtera au premier élément

1 <- 1 <- 2 <- 3
3
rupinderjeet

1) Faites une mise en page

      <RelativeLayout
                Android:layout_width="match_parent"
                Android:layout_height="200dp"
                Android:background="@color/white"
                Android:weightSum="1">



                <Android.support.v4.view.ViewPager
                    Android:id="@+id/images_pager"
                    Android:layout_width="match_parent"
                    Android:layout_height="match_parent"
                    >
                </Android.support.v4.view.ViewPager>

                <ImageView
                    Android:id="@+id/img_next"
                    Android:layout_width="35dp"
                    Android:layout_height="35dp"
                    Android:src="@drawable/forward_white"
                    Android:background="@color/colorPrimary"
                    Android:layout_centerVertical="true"
                    Android:layout_alignParentRight="true"
                    Android:layout_marginRight="5dp"
                    Android:paddingTop="5dp"
                    Android:paddingBottom="5dp"
                    />


                <ImageView
                    Android:id="@+id/img_previous"
                    Android:layout_width="35dp"
                    Android:layout_height="35dp"
                    Android:src="@drawable/back_white"
                    Android:background="@color/colorPrimary"
                    Android:layout_centerVertical="true"
                    Android:layout_marginLeft="5dp"
                    Android:layout_alignParentLeft="true"
                    Android:paddingTop="5dp"
                    Android:paddingBottom="5dp"/>


            </RelativeLayout>

2) Définir un adaptateur personnalisé

        CustomViewPagerAdapter  custompageradpter;
        ViewPager   mViewPager;
        mViewPager = (ViewPager)shareImagesDialouge.findViewById(R.id.images_pager); 
         custompageradpter = new CustomViewPagerAdapter(this);
         mViewPager.setAdapter(custompageradpter);

    public class CustomViewPagerAdapter  extends PagerAdapter {


        Context mContext;
        LayoutInflater mLayoutInflater;

        int[] mResources = {
                R.drawable.emoji_1,
                R.drawable.emoji_2,
                R.drawable.emoji_3,
                R.drawable.emoji_4,
                R.drawable.emoji_5,
                R.drawable.emoji_6
        };

        public CustomViewPagerAdapter(Context context) {
            mContext = context;
            mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

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

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

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View itemView = mLayoutInflater.inflate(R.layout.pager_item, container, false);

            ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView);
            imageView.setImageResource(mResources[position]);

            container.addView(itemView);

            return itemView;
        }

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

    }

3) Pour le bouton suivant et précédent

         case R.id.img_previous:
                    mViewPager.setCurrentItem(getItemofviewpager(-1), true);
                    break;

                case R.id.img_next:
                    mViewPager.setCurrentItem(getItemofviewpager(+1), true);
                    break;

4) Faites cette fonction

  private int getItemofviewpager(int i) {
        return mViewPager.getCurrentItem() + i;
    }
3
priti

Code de mise à jour

Button preButton = (Button)findViewById(R.id.pre_button);
        Button nextButton = (Button)findViewById(R.id.next_button);

        preButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                mViewPager.setCurrentItem(mViewPager.getCurrentItem()-1, true); 


            }
        });

        nextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1, true); 

            }
        });
1
Java coder

Fais-le comme ça:

backButton=(Button)findViewById(R.id.back_button);
nextButton=(Button)findViewById(R.id.next_button);
backButton.setVisibility(View.INVISIBLE);//you can use GONE or even disable it. It depends on your layout 


    nextButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View view) {
            viewPager.setCurrentItem(viewPager.getCurrentItem()+1, true);
        }
    });


    backButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View view) {
            viewPager.setCurrentItem(viewPager.getCurrentItem()-1, true);
        }
    });
}

Pour empêcher IndexOutOfBoundsException, vous devez masquer et afficher les deux boutons comme ceci:

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i1) {

        }
        @Override
        public void onPageSelected(int position) {
            if(position==0) {
                backButton.setVisibility(View.INVISIBLE);
            }else  {
                backButton.setVisibility(View.VISIBLE);
            }
            if(position < viewPager.getAdapter().getCount()-1 ) {
                nextButton.setVisibility(View.VISIBLE);
            }else  {
                nextButton.setVisibility(View.INVISIBLE);
            }
        }
        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });
1
Amr Berag

Créez d'abord une interface

public interface OnPageChangedListener {
void OnPageChanged(int position);      }

Ensuite, implémentez votre activité avec l'interface OnPageChangedListener et faites les choses ci-dessous

private void setupViewPager(ViewPager viewPager){
    viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
    viewPagerAdapter.addFragment(new Fragment1(this));
    viewPagerAdapter.addFragment(new Fragment2(this));
    viewPagerAdapter.addFragment(new Fragment3(this));
    viewPagerAdapter.addFragment(new Fragment4(this));
    viewPagerAdapter.addFragment(new Fragment5(this));
    viewPagerAdapter.addFragment(new Fragment6(this));
    viewPager.setAdapter(viewPagerAdapter);
}
@Override
public void OnPageChanged(int position) {
    viewPager.setCurrentItem(position);
}

Dans vos fragments, créez un constructeur en utilisant

private OnPageChangedListener listener;

public Fragment1(OnPageChangedListener listener1) {
    this.listener = listener1;
}

ViewPagerAdapter

public class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();

public ViewPagerAdapter(FragmentManager manager) {
    super(manager);
}

@Override
public Fragment getItem(int position) {
    switch (position) {
    }
    return mFragmentList.get(position);
}

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

public void addFragment(Fragment fragment) {
    mFragmentList.add(fragment);
}}

J'espère que cela vous aide

0
Bhaskar