Ich habe eine Aktivität und viele Fragmente in derselben aufgeblasen FrameLayout
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Beispiel: mainActivity> Beliebiges Fragment (Zurück-Taste drücken)> Aktivität ist leer.
In onCreate:
layout = (FrameLayout)findViewById(R.id.content_frame);
layout.setVisibility(View.GONE);
Wenn ich ein Fragment starte:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, profileFragment);
ft.addToBackStack(null);
ft.commit();
layout.setVisibility(View.VISIBLE);
Ich nehme an, ich muss die Sichtbarkeit des FrameLayout GONE
erneut auf den Rücken drücken, aber wie mache ich das?
Ich habe versucht onBackPressed
und eingestellt, layout.setVisibility(View.GONE);
aber ich kann nicht durch Fragmente zurückgehen, da ich direkt zur Hauptseite gehe.
android
android-fragments
Filip Luchianenco
quelle
quelle
FrameLayout
noch sichtbar ist, möchte ich es unsichtbar machen, aber ich kann onBackPressed nicht überschreiben, da ich nicht wie folgt vorgehen kann: activity> fragment1> fragment2> onBackPressed geht direkt zur Aktivität und zeigt es an und überspringt fragment2Antworten:
Wenn in der Aktivität mehr als ein Fragment verwendet wurde oder wenn Sie nur ein Fragment haben, sollte für das erste Fragment nicht addToBackStack definiert sein. Da dies eine Rückwärtsnavigation ermöglicht und vor diesem Fragment das leere Aktivitätslayout angezeigt wird.
// fragmentTransaction.addToBackStack() // dont include this for your first fragment.
Für das andere Fragment muss dies jedoch definiert sein, da sonst die Rückseite nicht zu einem früheren Bildschirm (Fragment) navigiert, sondern die Anwendung möglicherweise heruntergefahren wird.
quelle
val sft = supportFragmentManager.beginTransaction() if (supportFragmentManager.fragments.isNotEmpty()) sft .addToBackStack(null) sft .commit()
@Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { int fragments = getSupportFragmentManager().getBackStackEntryCount(); if (fragments == 1) { finish(); } else if (getFragmentManager().getBackStackEntryCount() > 1) { getFragmentManager().popBackStack(); } else { super.onBackPressed(); } } }
Ein Fragment hinzufügen
getSupportFragmentManager().beginTransaction() .replace(R.id.layout_main, dashboardFragment, getString(R.string.title_dashboard)) .addToBackStack(getString(R.string.title_dashboard)) .commit();
quelle
Entschuldigung für die späte Antwort.
Sie müssen ft.addToBackStack (null) nicht hinzufügen . beim Hinzufügen des ersten Fragments.
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.content_frame, profileFragment); // ft.addToBackStack(null); --remove this line. ft.commit(); // ... rest of code
quelle
Wenn Sie anhand der Fragmente verfolgen möchten, sollten Sie die
onBackPressed
Methode wie folgt überschreibenpublic void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() == 1) { finish(); } else { super.onBackPressed(); } }
quelle
Sie können überschreiben
onBackPressed
und überprüfen, ob sich etwas auf dem Backstack befindet.@Override public void onBackPressed() { int fragments = getFragmentManager().getBackStackEntryCount(); if (fragments == 1) { // make layout invisible since last fragment will be removed } super.onBackPressed(); }
quelle
fragments
Wert überprüft , es ist immer 0, auch wenn es das zweite oder dritte Fragment ist.getFragmentManager().executePendingTransactions();
vor jedem Fragment getan , auch ich habe die zweite Methode ausprobiertbefore fm.getBackStackEntryCount()
und immer noch kein Glück.Fügen Sie einfach nicht das erste Fragment zum Backstack hinzu
Hier ist der Kotlin-Code, der für mich funktioniert hat.
val ft = supportFragmentManager.beginTransaction().replace(container, frag) if (!supportFragmentManager.fragments.isEmpty()) ft.addToBackStack(null) ft.commit()
quelle
Bei einem kürzlich durchgeführten persönlichen Projekt habe ich dieses Problem gelöst, indem ich nicht aufgerufen habe,
addToBackStack
ob der Stapel leer ist.// don't add the first fragment to the backstack // otherwise, pressing back on that fragment will result in a blank screen if (fragmentManager.getFragments() != null) { transaction.addToBackStack(tag); }
Hier ist meine vollständige Implementierung:
String tag = String.valueOf(mCurrentSectionId); FragmentManager fragmentManager = mActivity.getSupportFragmentManager(); Fragment fragment = fragmentManager.findFragmentByTag(tag); if (fragment != null) { // if the fragment exists then no need to create it, just pop back to it so // that repeatedly toggling between fragments doesn't create a giant stack fragmentManager.popBackStackImmediate(tag, 0); } else { // at this point, popping back to that fragment didn't happen // So create a new one and then show it fragment = createFragmentForSection(mCurrentSectionId); FragmentTransaction transaction = fragmentManager.beginTransaction() .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .replace(R.id.main_content, fragment, tag); // don't add the first fragment to the backstack // otherwise, pressing back on that fragment will result in a blank screen if (fragmentManager.getFragments() != null) { transaction.addToBackStack(tag); } transaction.commit(); }
quelle
Die Lösung von irscomp funktioniert, wenn Sie die Aktivität beenden möchten, wenn die Zurück-Taste auf dem ersten Fragment gedrückt wird. Wenn Sie jedoch alle Fragmente verfolgen und in umgekehrter Reihenfolge von einem zum anderen zurückkehren möchten, fügen Sie alle Fragmente hinzu, mit denen gestapelt werden soll:
ft.addToBackStack(null);
Fügen Sie dies am Ende von onCreate () hinzu, um zu vermeiden, dass beim letzten Zurückdrücken ein leerer Bildschirm angezeigt wird. Sie können getSupportFragmentManager () oder getFragmentManager () abhängig von Ihrer API verwenden:
FragmentManager fm = getSupportFragmentManager(); fm.addOnBackStackChangedListener(new OnBackStackChangedListener() { @Override public void onBackStackChanged() { if(getSupportFragmentManager().getBackStackEntryCount() == 0) finish(); } });
Letzte Worte: Ich empfehle Ihnen nicht, diese Lösung zu verwenden, denn wenn Sie 10 Mal von Fragment1 zu Fragment 2 und umgekehrt wechseln und 10 Mal die Zurück-Taste drücken, geschieht dies in der Reihenfolge, in der die Benutzer dies nicht möchten.
quelle
Fast wie die Antwort von Goodlife , aber in gewisser
Xamarin.Android
Weise:Fragment laden ( ich habe dafür eine Hilfsmethode geschrieben, aber es ist nicht notwendig ):
public void LoadFragment(Activity activity, Fragment fragment, string fragmentTitle = "") { var fragmentManager = activity.FragmentManager; var fragmentTransaction = fragmentManager.BeginTransaction(); fragmentTransaction.Replace(Resource.Id.mainContainer, fragment); fragmentTransaction.AddToBackStack(fragmentTitle); fragmentTransaction.Commit(); }
Zurück-Taste ( in
MainActivity
):public override void OnBackPressed() { if (isNavDrawerOpen()) drawerLayout.CloseDrawers(); else { var backStackEntryCount = FragmentManager.BackStackEntryCount; if (backStackEntryCount == 1) Finish(); else if (backStackEntryCount > 1) FragmentManager.PopBackStack(); else base.OnBackPressed(); } }
Und
isNavDrawerOpen
Methode:bool isNavDrawerOpen() { return drawerLayout != null && drawerLayout.IsDrawerOpen(Android.Support.V4.View.GravityCompat.Start); }
quelle
Ich hatte das gleiche Problem beim Umgang mit dem Ui-Anmeldebildschirm von Firebase. Wenn die Zurück-Taste gedrückt wurde, blieb ein leerer Bildschirm übrig.
Um das Problem zu lösen, habe ich gerade
finish()
meineonStop()
Methode für diese Aktivität aufgerufen . Lief wie am Schnürchen.quelle
Ich konnte das Problem immer noch nicht beheben
getBackStackEntryCount()
und habe mein Problem gelöst, indem ich die Hauptseite ebenfalls zu einem Fragment gemacht habe. Am Ende habe ich also nur eine Aktivität mit einemFrameLayout
; und alle anderen Fragmente, einschließlich der Hauptseite, die ich in dieses Layout aufblase. Dies löste mein Problem.quelle