2014-09-25 26 views
8

Mam problem z dodaniem transakcji fragmentu do tylnego stosu. Mam Główna działalność, w której I wypełnić mój układ z fragmentem Menu:Ponowne naciśnięcie nie powraca do poprzedniego fragmentu.

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); 
} 

}

Następnie wewnątrz MainMenuFragment, użytkownik wybiera pewną opcję, która powoduje zastąpienie fragmentu menu z innego fragmentu :

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(); 
    } 
} 

}

Przez co rozumiem, to powinien zrobić to tak, że gdy użytkownik naciśnie przycisk z powrotem na swoim urządzeniu, będą b powrócił do fragmentu menu, ale zamiast tego zamyka aplikację. Co ja robię źle?

+0

spróbuj dodać zamiast zastępowania trans.add (R.id.frag_container, new BasicSettingsFragment()); –

+0

Ponadto zauważyłem, że po obróceniu ekranu fragment menu nie został w ogóle usunięty, po prostu ukryty. Po obróceniu telefonu pojawił się nad 'BasicSettingsFragment'. @GeorgianBenetatos dodanie tylko umieścić nowy fragment na poprzedniej. – jammaster

+0

Powinieneś opublikować pełny kod MainMenuFragment, wszystko wygląda dobrze. –

Odpowiedz

2

Twój kod jest miksowaniem, korzystasz z ActionBarActivity z appcompat i nie korzystasz z getSupportFragmentManager(), a import fragmentów powinien być plikiem appcompat, jeśli zdecydujesz się go użyć. Jeśli nie, użyj funkcji Activity zamiast ActionBarActivity i zaimportuj proste FragmentManager

Dodaj to do swojej aktywności android:configChanges="keyboardHidden|orientation|screenSize" Spowoduje to zatrzymanie aktywności po ponownym uruchomieniu. użyj setRetainInstance(true) na fragmentach.

+0

Przeczytaj komentarze, rozwiązałem tę część. –

+0

Powinieneś raczej zachęcić OP do opublikowania nowego pytania. –

0

Po dodaniu lub zamianie fragmentu na FragmentManager należy ręcznie dodać stary fragment do backstack z numerem addToBackStack() przed wywołaniem commit().

+0

To właśnie robię. Problem polega na tym, że gdy używam 'replace', to nie usuwa on starego fragmentu, ponieważ kiedy obracam ekran, pojawia się on na górze tego, co było przed rotacją. – jammaster

1

Nie dodajesz MainMenuFragment do tylnego stosu. Możesz spróbować tego na swojej działalności:

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

W swojej działalności Zastąp:

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

I prawdopodobnie trzeba użyć w każdym popełnił transakcję fragment:

FragmentTransaction.addToBackStack(null);