2012-10-03 7 views
6

Ich benutze einen ViewPager, um Swiping in meiner Android App zu implementieren. Ich möchte jedoch, dass das vorherige Fragment angezeigt wird, wenn der Benutzer die Zurück-Schaltfläche verwendet, anstatt die Aktivität zu beenden. Gibt es eine Möglichkeit, das zu tun? Dank SebastianVerwenden Sie Backstack mit ViewPager

Antwort

4

Aufschalten die Funktionalität Ihres 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

perfekt, vielen dank! – Sebastian

4

Ich hatte ein ähnliches Problem, das ist, wie ich es gelöst. Ich hatte einen ViewPager mit 6 Fragmenten und wollte den Seitenverlauf verfolgen und mit der Zurück-Taste rückwärts im Verlauf navigieren. Ich erstelle ein java.util.Stack<Integer> Objekt, füge Fragmentnummern hinzu (außer wenn du die Zurück-Schaltfläche benutzt, siehe unten), und überschreibe onBackPressed(), damit es das zuletzt gesehene Fragment löscht, anstatt den Backstack zu verwenden, wenn mein History-Stack nicht leer ist.

Sie möchten verhindern, dass Elemente auf den Stack gedrückt werden, wenn Sie die Zurück-Taste drücken, sonst bleiben Sie zwischen zwei Fragmenten stecken, wenn Sie die Zurück-Taste weiterhin verwenden, anstatt sie zu beenden.

Mein Code:

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

ich gleiche Problem und ich folgen Sie diesem Schritt (meine Antwort Edited --- Sicherlich für mich arbeiten, geben Sie ihm ein versuchen)

In der Haupttätigkeit wo gibt es 3 fragment in viewpager ich stack erstellen und push und pop daten.

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) { 
     } 
    }); 
} 

und in der onBackPressed in Aktivität,

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

Hope this helfen kann oder mir msg.

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. –

+0

@JaiprakashSoni danke für den Vorschlag. Ich habe meine Antwort bearbeitet. Hoffe, dass dies anderen helfen kann –