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
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
}
}
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;
}
};
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.
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. –
@JaiprakashSoni danke für den Vorschlag. Ich habe meine Antwort bearbeitet. Hoffe, dass dies anderen helfen kann –
perfekt, vielen dank! – Sebastian