2012-10-03 18 views
6

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

4

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 
    } 
} 
+0

idealne, wielkie dzięki! – Sebastian

4

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

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.

+0

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. –

+0

@JaiprakashSoni dzięki za sugestię. zredagowałem swoją odpowiedź. Mam nadzieję, że to może pomóc innym –

Powiązane problemy