Use backstack com ViewPager
-
13-12-2019 - |
Pergunta
Estou usando um ViewPager para implementar o deslizamento em meu aplicativo Android.Porém, gostaria que o fragmento anterior fosse mostrado quando o usuário usasse o botão Voltar em vez de encerrar a atividade.Existe alguma maneira de fazer isso?Obrigado Sebastian
Solução
Substitua a funcionalidade do seu Activity
:
public class Activity extends Activity
{
@Override
public void onBackPressed()
{
// do stuff
myFragment.onBackPressed();
}
}
public class Fragment extends Fragment
{
public void onBackPressed()
{
// do stuff
}
}
Outras dicas
Eu tive um problema semelhante, foi assim que resolvi.Eu tinha um ViewPager com 6 fragmentos e queria acompanhar o histórico da página e poder usar o botão Voltar para navegar para trás no histórico.Eu crio um java.util.Stack<Integer>
objeto, adicione números de fragmentos a ele (exceto quando você usa o botão Voltar, veja abaixo) e substitua onBackPressed()
para fazer aparecer o último fragmento visualizado em vez de usar a pilha de retorno, quando minha pilha de histórico não estiver vazia.
Você deseja evitar empurrar elementos na pilha ao pressionar o botão Voltar, caso contrário, ficará preso entre dois fragmentos se continuar usando o botão Voltar, em vez de eventualmente sair.
Meu 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;
}
};
Substituir o método abaixo em Fragment Activity deve resolver seu 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);
}
}
Eu tenho o mesmo problema e sigo esta etapa (Editei minha resposta --- Certamente funciona para mim, experimente)
Na atividade principal onde há 3 fragmentos no viewpager eu crio pilha e dados push e pop.
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) {
}
});
}
e na atividade onBackPressed in,
//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 isso possa ajudar ou me envie uma mensagem.