Używam ViewPager do realizacji przesuwania w mojej aplikacji na Androida. Chciałbym jednak, aby poprzedni fragment był wyświetlany, gdy użytkownik użyje przycisku Wstecz zamiast zakończenia działania. Czy istnieje jakiś sposób, aby to zrobić? Dzięki SebastianUżyj backstack z ViewPager
Odpowiedz
zastąpić funkcjonalność Activity
:
public class Activity extends Activity
{
@Override
public void onBackPressed()
{
// do stuff
myFragment.onBackPressed();
}
}
public class Fragment extends Fragment
{
public void onBackPressed()
{
// do stuff
}
}
miałem podobny problem, to jak mogę rozwiązać go. Miałem ViewPagera z 6 fragmentami i chciałem śledzić historię strony i móc korzystać z przycisku wstecz, aby nawigować wstecz w historii. Tworzę obiekt java.util.Stack<Integer>
, dodając do niego numery fragmentów (z wyjątkiem sytuacji, gdy używasz przycisku wstecz, patrz poniżej) i zastępujesz onBackPressed()
, aby uczynić go pop ostatnio oglądanym fragmentem, zamiast używać stosu wstecz, gdy mój stos historii nie jest pusty.
Chcesz uniknąć przesuwania elementów na stosie, gdy naciśniesz przycisk Wstecz, w przeciwnym razie utkniesz między dwoma fragmentami, jeśli nadal używasz przycisku Wstecz, zamiast w końcu wyjść.
Mój kod:
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;
}
};
mam ten sam problem i śledzę ten krok (Pod moją odpowiedź --- Oczywiście dla mnie pracować, dać mu spróbować)
W głównej działalności gdzie są 3 fragmenty w ViewPagerze i tworzę stos oraz dane push i 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) {
}
});
}
aw onBackPressed aktywności,
//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 {
}
}
Nadzieja może pomóc lub msg mnie.
Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. –
@JaiprakashSoni dzięki za sugestię. zredagowałem swoją odpowiedź. Mam nadzieję, że to może pomóc innym –
idealne, wielkie dzięki! – Sebastian