Android ViewPager Пред./Следующая кнопка
Хорошо, поэтому я разрабатываю приложение для Android, которое использует ViewPager для отображения страниц.
Внутри каждой страницы у меня есть набор кнопок для навигации между страницами (помимо прокрутки между страницами). Эти кнопки предназначены для "первой страницы", "предыдущей страницы", "следующей страницы" и "последней страницы".
То, что я не могу понять, как это сделать, - это создать механизм для изменения страницы нажатием кнопки.
У кого-нибудь есть идеи?
ETA. Чтобы лучше объяснить настройку, кнопки объявляются в каждом макете страницы и раздуваются с остальной частью макета внутри PagerAdapter. Моя проблема в том, что я не могу ссылаться на ViewPager из PagerAdapter. Или, по крайней мере, я не могу придумать, как это сделать.
Ответы
Ответ 1
Кнопка
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
}
});
Функции:
private int getItem(int i) {
return mViewPager.getCurrentItem() + i;
}
Надеюсь, что это поможет:)
Ответ 2
yourButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
yourViewPager.setCurrentItem(page, smoothScroll);
}
});
Ответ 3
Я закончил этот проект с помощью этого кода.
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);
}
});
Ответ 4
1) Сделайте макет
<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) Установите пользовательский адаптер
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) Для следующей и предыдущей кнопки
case R.id.img_previous:
mViewPager.setCurrentItem(getItemofviewpager(-1), true);
break;
case R.id.img_next:
mViewPager.setCurrentItem(getItemofviewpager(+1), true);
break;
4) Сделайте эту функцию
private int getItemofviewpager(int i) {
return mViewPager.getCurrentItem() + i;
}
Ответ 5
Безотказное обновление до ответа Шуггерсена и Алекса Орлова,
// 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);
}
});
Добавьте метод getNextPossibleItemIndex() в свой Activity/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) ;
}
Таким образом, вы сможете изменить currentItem, не беспокоясь об исключении IndexOutOfBoundsException, как это предлагается в комментарии Генриха. Обратите внимание, что при использовании этого метода элементы будут отображаться в виде кругового списка.
1 -> 2 -> 3 -> 1 -> 2 -> 3 -> 1
Но возвращаясь, он остановится на первом пункте
1 <- 1 <- 2 <- 3
Ответ 6
Обновить код
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);
}
});
Ответ 7
Сделай это так:
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);
}
});
}
Чтобы предотвратить исключение IndexOutOfBoundsException, вы должны скрыть и показать две кнопки следующим образом:
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) {
}
});
Ответ 8
Сначала создайте интерфейс
public interface OnPageChangedListener {
void OnPageChanged(int position); }
Далее Реализуйте свою деятельность с помощью интерфейса OnPageChangedListener и выполните следующие действия
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);
}
В ваших фрагментах создайте конструктор, используя
private OnPageChangedListener listener;
public Fragment1(OnPageChangedListener listener1) {
this.listener = listener1;
}
Надеюсь, это поможет вам
Ответ 9
public void onClick(View v) {
int currentItem = mViewPager.getCurrentItem();
mViewPager.setCurrentItem(currentItem+1); //(currentItem-1)
}
только этот код при нажатии кнопки:
@Override
getcurrentitem
- это фактический элемент в viewpager
, следующий элемент currentItem + 1