2012-10-03 27 views
6

Estoy usando ViewPager para implementar deslizamiento en mi aplicación de Android. Sin embargo, me gustaría que se muestre el fragmento anterior cuando el usuario usa el botón Atrás en lugar de finalizar la actividad. ¿Hay alguna forma de hacer eso? Gracias SebastiánUsar backstack con ViewPager

Respuesta

4

Anulación de 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 
    } 
} 
+0

perfecto, muchas gracias! – Sebastian

4

tuve un problema similar, esto es cómo lo resolví. Tenía un ViewPager con 6 fragmentos y quería hacer 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>, le agrego números de fragmento (excepto cuando utilizo el botón Atrás, ver más abajo), y anulo onBackPressed() para hacer que aparezca el último fragmento visto en lugar de usar la pila posterior, cuando mi pila de historial no está vacía.

Desea evitar presionar elementos en la pila cuando presiona el botón Atrás, de lo contrario se quedará atascado entre dos fragmentos si continúa utilizando el botón Atrás, en lugar de salir finalmente.

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

Tengo mismo problema y siga con este paso (editado mi respuesta --- Ciertamente funciona para mí, darle una oportunidad)

En la actividad donde hay 3 fragmentos en viewpager creo stack y push y pop data.

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 el 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 { 
    } 
} 

la esperanza que esto puede ayudar o msg me.

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. –

+0

@JaiprakashSoni gracias por la sugerencia. He editado mi respuesta. Espero que esto pueda ayudar a otros –