Ich habe eine Aktivität, die zunächst einen ViewPager hostet, der an einen FragmentPagerAdapter angeschlossen ist.ViewPager durch Fragment ersetzen - Dann zurück navigieren
Wenn der Benutzer auf ein Element im Child-Fragment des ViewPagers klickt, verwende ich eine FragmentTransaction, um eine leere Containeransicht durch ein neues Fragment zu ersetzen, zu dem ich navigieren möchte.
Wenn ich addToBackStack() für die Transaktion verwende, die Transaktion festschreibe und dann zurück navigiere, komme ich nicht zu den ViewPager-Ansichten zurück (das ursprüngliche Layout).
Wenn ich addToBackStack() für die Transaktion nicht verwende, die Transaktion festschreibe und dann zurück navigiere, wird die Anwendung beendet.
Es scheint offensichtlich, dass der ViewPager nicht zum Backstack hinzugefügt wird (was nicht so überraschend ist, da es kein Fragment an sich ist). Aber ich würde erwarten, dass das Zurückdrücken mich zurücknimmt zu dieser Aktivität initial View (der ViewPager).
Basierend auf dem, was ich gelesen habe, scheint es, dass der ViewPager oder PagerAdapter, vielleicht weil eine Fragmenttransaktion stattfindet, den Überblick darüber verliert, welches Fragment angezeigt werden soll.
Ich bin wirklich mit diesem verwirrt, aber ich endete damit, eine riesige Unordnung des Codes zu schaffen, der onBackPress überschreibt und die viewpager Ansichten zeigt und versteckt. Ich hätte gedacht, dass es eine einfachere Möglichkeit gibt, Standardverhalten zu verwenden, um die entsprechende Navigation auszuführen.
tl; dr
A ein Viewpager Hosting-Fragmente. B ist ein neues Fragment.
Wenn ich A durch B ersetze und dann zurück drücke, gehe ich zurück zu A, aber das passiert nicht.
Jeder Rat würde sehr geschätzt werden.
Code:
MainActivity:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
headingLayout = (RelativeLayout) findViewById(R.id.headingLayout);
headingLayout.setVisibility(View.GONE);
// Set up the ViewPager, attaching the adapter and setting up a listener
// for when the
// user swipes between sections.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setPageMargin(8);
/** Getting fragment manager */
FragmentManager fm = getSupportFragmentManager();
/** Instantiating FragmentPagerAdapter */
MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);
/** Setting the pagerAdapter to the pager object */
mViewPager.setAdapter(pagerAdapter);
.
.
.
}
public void onListItemClicked(Fragment fragment) {
fromPlayer = false;
InitiateTransaction(fragment, true);
}
public void InitiateTransaction(Fragment fragment, boolean addToBackStack) {
invalidateOptionsMenu();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fragmentContainer, fragment).addToBackStack(null)
.commit();
}
PagerAdapter:
package another.music.player;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import another.music.player.fragments.AlbumListFragment;
import another.music.player.fragments.ArtistListFragment;
import another.music.player.fragments.SongListFragment;
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
final int PAGE_COUNT = 3;
/** Constructor of the class */
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
ArtistListFragment artistListFragment = new ArtistListFragment();
Bundle artistData = new Bundle();
artistData.putInt("current_page", i + 1);
artistListFragment.setArguments(artistData);
return artistListFragment;
case 1:
AlbumListFragment albumListFragment = new AlbumListFragment();
Bundle albumData = new Bundle();
albumData.putInt("current_page", i + 1);
albumData.putBoolean("showHeader", false);
albumListFragment.setArguments(albumData);
return albumListFragment;
default:
SongListFragment songListFragment = new SongListFragment();
Bundle songData = new Bundle();
songData.putInt("current_page", i + 1);
songListFragment.setArguments(songData);
return songListFragment;
}
}
/** Returns the number of pages */
@Override
public int getCount() {
return PAGE_COUNT;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Artists";
case 1:
return "Albums";
default:
return "Songs";
}
}
}
Haupt XML (enthaltend fragmentContainer & ViewPager):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/app_background_ics" >
<RelativeLayout
android:id="@+id/headingLayout"
android:layout_width="match_parent"
android:layout_height="56dp" >
</RelativeLayout>
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/headingLayout" />
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<android.support.v4.view.PagerTabStrip
android:id="@+id/pager_title_strip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#33b5e5"
android:paddingBottom="4dp"
android:paddingTop="4dp"
android:textColor="#fff" />
</android.support.v4.view.ViewPager>
</RelativeLayout>
YES! Vielen Dank. –