2014-09-25 17 views
8

Ho un problema con l'aggiunta delle transazioni del frammento allo stack posteriore. Ho un Attività principale in cui io popolo mio layout con un frammento Menu:Premendo indietro non si torna al frammento precedente

public class MainActivity extends ActionBarActivity{ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    getFragmentManager().beginTransaction().add(R.id.frag_container, new MainMenuFragment()).commit(); 
} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

}

Poi, all'interno del MainMenuFragment, l'utente sceglie qualche opzione che si traduce nella sostituzione del frammento menu con qualche altro frammento :

public class MainMenuFragment extends Fragment implements OnItemClickListener{ 
    GridView grid; 
    FragmentManager manager; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View root = inflater.inflate(R.layout.main_menu_fragment, container, false); 

    manager = getActivity().getFragmentManager(); 
    grid = (GridView) root.findViewById(R.id.gridView1); 

    grid.setAdapter(new MenuTileAdapter(getActivity())); 
    grid.setOnItemClickListener(this); 

    return root; 
} 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    FragmentTransaction trans = manager.beginTransaction(); 
    if (position == 0){ 
     trans.replace(R.id.frag_container, new BasicSettingsFragment()); 
     trans.addToBackStack(null); 
     trans.commit(); 
    } 
} 

}

Per quello che ho capito, questo dovrebbe fare in modo che quando l'utente preme pulsante indietro sul dispositivo, saranno b ritorto al frammento del menu, ma invece si chiude l'app. Che cosa sto facendo di sbagliato?

+0

prova ad aggiungere invece di sostituire trans.add (R.id.frag_container, new BasicSettingsFragment()); –

+0

Inoltre, ho appena notato ruotando lo schermo, che il frammento del menu non è stato rimosso, solo nascosto. Quando ho ruotato il mio telefono, è apparso su 'BasicSettingsFragment'. @GeorgianBenetatos aggiungendo solo metti il ​​nuovo frammento sopra quello precedente. – jammaster

+0

Dovresti pubblicare il codice MainMenuFragment completo, tutto sembra a posto. –

risposta

2

Il codice è un mixaggio, si utilizza ActionBarActivity da appcompat e non si utilizza getSupportFragmentManager() e l'importazione dei frammenti deve essere appcompat se si decide di utilizzarlo. In caso contrario, utilizzare attività invece di ActionBarActivity e la semplice importazione Frammento con FragmentManager

Aggiungi questo alla vostra attività android:configChanges="keyboardHidden|orientation|screenSize" Questo fermerà la vostra attività riavvio quando si ruota. usa setRetainInstance(true) su frammenti.

+0

Leggi i commenti, ho risolto quella parte. –

+0

Probabilmente dovresti incoraggiare l'OP a pubblicare una nuova domanda. –

0

Quando si aggiunge o si sostituisce un frammento con FragmentManager, è necessario aggiungere manualmente il vecchio frammento al backstack con addToBackStack() prima di chiamare commit().

+0

Questo è quello che sto facendo. Il problema è che quando uso 'replace', non rimuove il vecchio frammento, perché quando ruoto lo schermo, appare sopra quello che c'era prima della rotazione. – jammaster

1

Non si aggiunge il MainMenuFragment allo stack posteriore. Si può provare questo uno sulla vostra attività:

getFragmentManager().beginTransaction().add(
R.id.frag_container, new MainMenuFragment()). 
addToBackStack(null).commit(); 
5

Nella tua Attività sovrascrittura:

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

E probabilmente è necessario utilizzare in ogni transazione frammento Commited:

FragmentTransaction.addToBackStack(null);