2015-04-22 14 views
10

Sto utilizzando il nuovo AppCompatActivity introdotto nella versione di libreria AppCompat 22.1.Il frammento dello stack posteriore non funziona quando si estende AppCompatActivity

Quando estendo questa attività, il pulsante di back hardware non fa più uscire lo stack posteriore dei miei frammenti, ma chiude l'attività.

Ecco come sto cambiando frammenti nella mia attività:

public void changeFragment(Fragment f) { 
    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.replace(R.id.fragment_holder, f); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

Se cambio MainActivity extends AppCompatActivity-MainActivity extends Activity il problema va via e io sono in grado di andare a ritroso attraverso i miei frammenti.

Modifica delle chiamate verso getFragmentManager() a getSupportFragmentManager() risultati in dispositivi con Android 5.0 < perdere il tema materiale, che è stato il motivo principale per l'attuazione AppCompatActivity in primo luogo.

Lo stile fatto riferimento nel mio manifesto <application android:theme="@style/AppTheme">

<style name="AppTheme" parent="Theme.AppCompat.Light"> 
    <item name="colorPrimary">@color/primary_material_light</item> 
    <item name="colorPrimaryDark">@color/primary_dark_material_light</item> 
    <item name="colorAccent">@color/accent_material_light</item> 
</style> 
+0

Pubblica il tuo stile. –

risposta

10

sono stato in grado di risolvere questo ridefinendo onBackPressed() nella mia attività:

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 0) { 
     getFragmentManager().popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

Se qualcuno ha qualche informazioni sul perché questo ulteriore passaggio è necessario quando si utilizza AppCompatActivity Sarei interessato a sapere.

+0

Sei anche in grado di capire perché fa if (savedInstanceState! = null) { } costrutto non è chiamato onCreate? Sono stato in grado di risolvere il problema con il tuo codice, ma il titolo di aggiornamento non viene chiamato. –

+0

Questa è la risposta sbagliata. Vedi @WookLiu per quello corretto. –

+0

perché si estende "attività o frammentattività" che non si può fare con extends fragment, non si risolve la domanda su "come richiamare Fragment back" – delive

8

uso getSupportFragmentManager() invece di getFragmentManager()

+0

Ho provato questo, ma ha provocato la perdita del tema Materiale sui dispositivi <5.0. Aggiornata la domanda per includere questo dettaglio. – howettl

+0

prova questo http://stackoverflow.com/questions/24445012/material-design-backward-compatibility – WoookLiu

+0

Inoltre, quando usi 'supportFragmentManager' non ha nulla a che fare con' PreferenceFragment' – StAlex

-3

State estendere la vostra app tema da Theme.AppCompat.*?

+0

Sì. '' – howettl

+1

Non porre domande nella risposta ... – Harry

Problemi correlati