Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Llame a actvity después de que el viewpager haya terminado

Estoy desarrollando una aplicación en la que tengo que usar viewpager y después de que todos los elementos en viewpager haya terminado tengo que llamar a una actividad. No puedo escuchar a los eventos para esto. Aquí es lo que he estado haciendo referencia también: https://github.com/chiuki/android-swipe-image-viewer/blob/master/src/com/sqisland/android/swipe_image_viewer/MainActivity.java

Esto es lo que he hecho hasta ahora:

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); } } } 

Mi pregunta es cómo obtener el receptor de eventos si todos los elementos de viewpager están terminados.

Cualquier tipo de ayuda será apreciada.

  • Lona de Android, múltiples rutas con diferentes cantidades de zoom
  • Uso de la actividad de la cámara en Android
  • Daga con Android: ¿Cómo inyectar el contexto cuando se utiliza MVP?
  • Cómo ordenar ArrayLists utilizando booleanos en java?
  • Cómo analizar JSON Array con Gson
  • Android: firma digital con Bezier
  • Cómo configurar la imagen de fondo del botón a través del código
  • Al hacer clic en la notificación no se abre la actividad mencionada
  • 4 Solutions collect form web for “Llame a actvity después de que el viewpager haya terminado”

     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 o onPageSelected cualquiera de estos que puede utilizar aquí y también comprobar la página seleccionada es igual al número de elementos en el ViewPager .

    Estas tres llamadas de retorno funcionan de esta manera:

    • OnPageScrollStateChanged se llama con el estado ViewPager.SCROLL_STATE_DRAGGING
    • OnPageScrolled se llamará muchas veces, su parámetro positionOffset y positionOffsetPixels siguen aumentando
    • OnPageScrolled parámetro positionOffset más de 0,5, onPageScrollStateChanged se llama con el estado SCROLL_STATE_SETTLING
    • OnPageSelected se llama con el índice de la página siguiente como posición
    • OnPageScrolled se llamará muchas veces, su parámetro positionOffset y positionOffsetPixels siguen aumentando
    • El parámetro positionOffset de onPageScrolled es 1, onPageScrollStateChanged se llama con el estado SCROLL_STATE_IDLE

    La lógica no debe poner en onPageSelected y onPageScrollStateChanged, porque con ellos sólo sabes estado se cambia. Sólo en onPageScrolled puede obtener la dirección. Así que mi implementación es así:

      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; } } 

    Gracias Triode por una gran respuesta.

    Utilicé el código que publicaste para mi proyecto. En mi caso, estoy terminando la actividad si un usuario pasa a la derecha en el último fragmento. Funcionó bien, pero todavía estaba terminando la actividad cuando se desliza hacia la izquierda en lugar de deslizarse hacia la derecha.

    Hice un cambio en su código y poner adapter.getCount() - 1 en lugar de selectedIndex . En este caso no terminará la actividad si el usuario pasa a la izquierda.

     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; } } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.