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.
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 :)
yourButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
yourViewPager.setCurrentItem(page, smoothScroll);
}
});
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);
}
});
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
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;
}
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);
}
});
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) {
}
});
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