2016-11-11 1 views
1

Ich bin neu in Android-Entwicklung und Entwicklung einer Anwendung mit Android Standard-Navigation-Schublade-Layout.Zurück zum vorherigen Fragment auf OnBackPressed in Android

Ich verwende Fragment in der Anwendung.

Ich möchte zurück zum vorherigen Fragment, wenn die Zurück-Taste auf das nächste Fragment gedrückt wird. Die onBackPress muss

  1. folgende Funktionen implementieren, um vorherige Fragment Holen Sie sich zurück, wenn auf der nächsten Fragment
  2. Schublade schließen, wenn Navigationsleiste geöffnet ist
  3. Beenden App auf Doppel zurück drücken, wenn in fragment1

Dies ist, was mein Code ist in MainActivity beim Erstellen neuer Fragment

// replacing the fragment 
if (fragment != null) { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.content_frame, fragment); 
    ft.commit(); 
} 

onBackPress

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else if (getFragmentManager().getBackStackEntryCount() > 0) { 
     FragmentManager fm = getSupportFragmentManager(); 
     fm.popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

Aber das funktioniert nicht und beim Drücken beendet zurück, um die Anwendung der Ausnahme, wenn die Navigationsleiste geöffnet ist es geschlossen ist.

Antwort

1

Sie fügen das Fragment nicht dem Backstack hinzu. Sie müssen nur

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
.replace(R.id.content_frame, fragment); 
.addToBackStack(null); 
.commit(); 

Und da die Backstack tatsächlich von der Back-Button gehandhabt wird tun, brauchen Sie nicht dieses Szenario in onBackPressed() zu handhaben, so dass Sie es ändern können einfach:

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     super.onBackPressed(); 
    } 
} 
+0

hinzufügen '.addToBackStack (null);' funktioniert nicht.Nach dem Hinzufügen dieser Zeile passiert beim ersten Drücken der Taste Zurück nichts und bei einem zweiten Klick wird die Anwendung beendet –

0

Sie müssen die Fragment in Ihrem FragmentTransaction zum Backstack hinzufügen.

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.content_frame, fragment).addtoBackStack(null).commit(); 

den Tag Indem null sie alle von diesem Tag gruppiert bekommen. Also, wenn Sie alle zusammen schließen müssen, können Sie dies tun oder zu einem bestimmten navigieren.

Ich würde auch nicht verwenden replace(), weil das ist unglaublich Buggy mit dem Backstack.

Versuchen Sie, remove() und dann add() zu verwenden.

0

// this variable is needed to know how many times the back key has been pressed. 
// It is incremented and reset accordingly to the logic you described 
int mBackPressCount = 0; 

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     if (getFragmentManager().getBackStackEntryCount() == 0) { 
      // if there are no fragments in your back stack check the mBackPressCount 
      if (mBackPressCount++ > 0) { 
       // if you pressed back for the second time this line will terminate the activity 
       super.onBackPressed(); 
      } 
     } else { 
      // this line will pop the fragment from the back stack, 
      // no need to pop it manually 
      super.onBackPressed(); 
     } 
    } 
} 

Fügen Sie das Fragment auf der Rückseite Stapel: Sie sollten Ihr Fragment auf der Rückseite Stapel und ändern Sie den Code auf diese Weise hinzufügen

if (fragment != null) { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.content_frame, fragment); 
    ft.addToBackStack(null); 
    ft.commit(); 

    // when you add a fragment you should reset the back press count 
    mBackPressCount = 0; 
} 

Setzen Sie mBackPressCount zurück, wenn Sie die Schublade öffnen und schließen. Wenn Sie einmal die Zurück-Taste gedrückt haben und Sie die Schublade öffnen, muss der Zähler wieder auf 0 gesetzt werden.

DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() { 
    @Override 
    public void onDrawerSlide(View drawerView, float slideOffset) { 

    } 

    @Override 
    public void onDrawerOpened(View drawerView) { 
     mBackPressCount = 0; 
    } 

    @Override 
    public void onDrawerClosed(View drawerView) { 
     mBackPressCount = 0; 
    } 

    @Override 
    public void onDrawerStateChanged(int newState) { 

    } 
}); 
+0

wo das 3. Code-Segment einfügen? 'drawerLayout' ist ein Objekt von' DrawerLayout'? –

+0

können Sie es in die onCreate-Methode einfügen. Das Snippet wurde geändert. Allerdings schlage ich vor, Datenbindung zu verwenden, um all diese findViewById-Aufrufe zu vermeiden (https://developer.android.com/topic/libraries/data-binding/index.html) – Massimo

+0

Ich habe getan, was Sie gesagt haben, aber am 2. Fragment es akzeptiert 3 mal zurück drücken und nichts passiert und auf der 3. Taste drücken, die Anwendung beendet –

Verwandte Themen