Pregunta

Estoy usando un viewpager para implementar el swiping en mi aplicación de Android.Sin embargo, me gustaría que se muestre el fragmento anterior cuando el usuario use el botón Atrás en lugar de finalizar la actividad.¿Hay alguna manera de hacerlo? Gracias Sebastian

¿Fue útil?

Solución

anular la funcionalidad de su Activity:

public class Activity extends Activity
{
    @Override
    public void onBackPressed()
    {
        // do stuff
        myFragment.onBackPressed();
    }
}

public class Fragment extends Fragment
{

    public void onBackPressed()
    {
        // do stuff
    }
}

Otros consejos

Tuve un problema similar, así es como lo resolví.Tenía un visor con 6 fragmentos y quería realizar un seguimiento del historial de la página y poder usar el botón Atrás para navegar hacia atrás en el historial.Creo un objeto java.util.Stack<Integer>, agregue los números de fragmento a él (excepto cuando use el botón Atrás, consulte a continuación), y anula onBackPressed() para hacer que establezca el último fragmento visto en lugar de usar la pila de atrás, cuando mi pila de historia no está vacía.

Desea evitar presionar elementos en la pila cuando presione el botón ATRÁS, de lo contrario se quedará atascado entre dos fragmentos si sigue usando el botón Atrás, en lugar de salir eventualmente.

Mi código:

MyAdapter mAdapter;
ViewPager mPager;
Stack<Integer> pageHistory;
int currentPage;
boolean saveToHistory;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mAdapter = new MyAdapter(getSupportFragmentManager());
    mPager = (ViewPager)findViewById(R.id.container);
    mPager.setAdapter(mAdapter);
    mPager.setOffscreenPageLimit(5);

    pageHistory = new Stack<Integer>();
    mPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {
            if(saveToHistory)
                pageHistory.push(Integer.valueOf(currentPage));
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
    saveToHistory = true;
}

@Override
public void onBackPressed() {
    if(pageHistory.empty())
        super.onBackPressed();
    else {
        saveToHistory = false;
        mPager.setCurrentItem(pageHistory.pop().intValue());
        saveToHistory = true;
    }
};

Anulación por debajo del método en la actividad del fragmento debe resolver su problema.

@Override
public void onBackPressed() {
    if (mViewPager.getCurrentItem() == 0) {
        // If the user is currently looking at the first step, allow the system to handle the
        // Back button. This calls finish() on this activity and pops the back stack.
        super.onBackPressed();
    } else {
        // Otherwise, select the previous step.
        mViewPager.setCurrentItem(mViewPager.getCurrentItem() - 1);
    }
}

Tengo el mismo problema y sigo este paso ( editado mi respuesta, sin duda trabaja para mí, dale un intento )

En la actividad principal donde hay 3 fragmentos en Viewpager, creo pila y empuje y envuelve datos.

private Stack<Integer> stackkk;
private ViewPager mPager;
private int tabPosition = 0;



    mTabLayout.setupWithViewPager(mPager);
    mPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
    mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            tabPosition = tab.getPosition();
            mPager.setCurrentItem(tab.getPosition());

// here i have add the data into the stack in each tab click, as at first it will always be null so i add 0 position

            if (stackkk.empty())
                stackkk.push(0);

            if (stackkk.contains(tabPosition)) {
                stackkk.remove(stackkk.indexOf(tabPosition));
                stackkk.push(tabPosition);
            } else {
                stackkk.push(tabPosition);
            }
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            tabPositionUnselected = tab.getPosition();
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });
}

y en la actividad onbackpressed en la actividad,

//OnbackPress i have first taken out the last one as it already and
//selected by poping it out then only set to the pager.
@Override
public void onBackPressed() {
    if (stackkk.size() > 1) {
        stackkk.pop();
        mPager.setCurrentItem(stackkk.lastElement());
    } else {
    }
}

Espero que esto pueda ayudarme o mándame.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top