Вызов actvity после завершения viewpager
Я разрабатываю приложение, в котором я должен использовать viewpager и после того, как все элементы в viewpager закончены, я должен вызвать действие. Я не могу получить прослушиватель событий для этого. Вот что я тоже имел в виду.: https://github.com/chiuki/android-swipe-image-viewer/blob/master/src/com/sqisland/android/swipe_image_viewer/MainActivity.java
вот что я сделал до сих пор:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
ImagePagerAdapter adapter = new ImagePagerAdapter();
viewPager.setAdapter(adapter);
OnPageChangeListener mListener = new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
Log.i("Doing something here", "On Scroll state changed");
}
};
viewPager.setOnPageChangeListener(mListener);
}
private class ImagePagerAdapter extends PagerAdapter {
private int[] mImages = new int[] { R.drawable.libin1,
R.drawable.libin2 };
@Override
public int getCount() {
return mImages.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((ImageView) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Context context = MainActivity.this;
ImageView imageView = new ImageView(context);
int padding = context.getResources().getDimensionPixelSize(
R.dimen.padding_medium);
imageView.setPadding(padding, padding, padding, padding);
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
imageView.setImageResource(mImages[position]);
((ViewPager) container).addView(imageView, 0);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((ImageView) object);
}
}
}
мой вопрос в том, как сделать прослушиватель событий, если все элементы в viewpager закончены.
любая помощь будет оценили.
5 ответов
private OnPageChangeListener mListener = new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
selectedIndex = arg0;
}
boolean callHappened;
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
if( mPageEnd && arg0 == selectedIndex && !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 == adapter.getCount() - 1)
{
mPageEnd = true;
}
}
};
ViewPager.setOnPageChangeListener(mListener);
onPageScrolled
или onPageSelected
любой из них вы можете использовать здесь и проверить выбранную страницу будет равно количеству элементов в ViewPager
.
эти три постбэк такой:
- onPageScrollStateChanged вызывается с помощью ViewPager состояния.SCROLL_STATE_DRAGGING
- onPageScrolled будет вызываться много раз, его параметр positionOffset и positionOffsetPixels продолжают увеличиваться
- onpagescrolled параметр positionOffset более 0,5, onPageScrollStateChanged вызывается с состоянием SCROLL_STATE_SETTLING
- onPageSelected вызывается со следующим индексом страницы как позиция
- onPageScrolled будет вызываться много раз, его параметр positionOffset и positionOffsetPixels продолжают увеличиваться
- параметр onpagescrolled positionOffset равен 1, onPageScrollStateChanged вызывается с состоянием SCROLL_STATE_IDLE
логика не должна помещаться в onPageSelected и onPageScrollStateChanged, потому что с ними вы знаете только состояние изменено. только в onPageScrolled вы можете получить направление. Поэтому моя реализация похожа это:
private int selectedPageIndex = -1;
private boolean exitWhenScrollNextPage = false;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (exitWhenScrollNextPage && position == PAGE_COUNT - 1) {
exitWhenScrollNextPage = false; // avoid call more times
AndroidLog.error("-------- YEAH!");
}
}
@Override
public void onPageSelected(int position) {
selectedPageIndex = position;
}
@Override
public void onPageScrollStateChanged(int state) {
if (state == SCROLL_STATE_IDLE) {
exitWhenScrollNextPage = selectedPageIndex == PAGE_COUNT - 1;
}
}
спасибо Triode за отличный ответ.
я использовал код, который вы выложили для моего проекта. В моем случае я заканчиваю действие, если пользователь проводит вправо по последнему фрагменту. Он работал нормально, но он все еще заканчивал работу, когда вы проводите влево, а не вправо.
я внес изменения в ваш код и поставил adapter.getCount() - 1
на месте selectedIndex
. В этом случае он не завершит действие, если пользователь пролистывает влево.
if( mPageEnd && arg0 == adapter.getCount()-1 && !callHappened){
Log.d(getClass().getName(), "Okay");
mPageEnd = false;//To avoid multiple calls.
callHappened = true;
}else{
mPageEnd = false;
}
@Override
public void onPageScrolled(int pageScrolledOn, float positionOffset, int positionOffsetPixels) {
if(positionOffset == 0F){
// meaning you cannot scroll further in current scroll direction
int lastPage = viewPagerAdapter.getCount - 1;
if (pageScrolledOn == lastPage){
//scroll on last page has occured
scrolledOnLastPage = true;
}
}
}
предлагаемые ответы сложны, чем я думал.Поэтому я создал простой.
я использовал OnPageChangeListener в классе ViewPager. Здесь мы имеем 3 метода. void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) void onPageSelected (int позиция); void onPageScrollStateChanged (состояние int);
важно знать, каковы состояния в onPageScrollStateChanged () и их последовательность выполнения.Есть 3 состояния как SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING и SCROLL_STATE_SETTLING.
вот порядок выполнения. Scroll_state_dragging --> Scroll_state_settling --> onPageSelected () -- > Scroll_state_idle
идея заключается в сохранении флага внутри onPageSelected() для записи текущего номера страницы. Затем, если пользователь на последней странице и проведите пальцем влево scroll_state_dragging вызвал и запустите следующий вид.
private int pagePosition; // keep a class variable
private int[] layouts= new int[]{
R.layout.welcome_slide1,
R.layout.welcome_slide2,
R.layout.welcome_slide3};
ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
addBottomDots(position);
pagePosition = position;
}
@Override
public void onPageScrolled(int position, float positionOffset, int arg2) {
}
@Override
public void onPageScrollStateChanged(int state) {
if (state == ViewPager.SCROLL_STATE_DRAGGING) {
if (pagePosition == layouts.length - 1) {
launchHomeScreen();
}
}
}
};
private void launchHomeScreen() {
startActivity(new Intent(IntroductionActivity.this, MainDockerActivity.class));
finish();
}
Я создал полный пример здесь.