Нажатие назад не возвращает предыдущий фрагмент

у меня проблема с добавлением транзакций фрагментов в задний стек. У меня есть основное действие, в котором я заполняю свой макет фрагментом меню:

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

}

затем, внутри MainMenuFragment, пользователь выбирает некоторую опцию, которая приводит к замене фрагмента меню на какой-то другой фрагмент:

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

}

для того, что я понимаю, это должно сделать так, чтобы, когда пользователь нажимает кнопку "назад" на своем устройстве, они будет возвращен к фрагменту меню, но вместо этого это выходит из приложения. Что я делаю не так?

4 ответов


ваш код является путаницей, вы используете ActionBarActivity из appcompat и не используете getSupportFragmentManager (), и импорт фрагментов должен быть appcompat, если вы решите его использовать. Если нет, используйте Activity вместо ActionBarActivity и простой импорт фрагментов с помощью FragmentManager

добавить в свою деятельность android:configChanges="keyboardHidden|orientation|screenSize" Это остановит вашу деятельность от перезапуска при вращении. использовать setRetainInstance(true) на фрагменты.


в своем активность заменить:

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

и, вероятно, вам нужно использовать в каждой транзакции commited fragment:

FragmentTransaction.addToBackStack(null);

вы не добавляете MainMenuFragment в задний стек. Вы можете попробовать это на вашей деятельности:

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

при добавлении или замене фрагмента на FragmentManager, вам нужно вручную добавить старый фрагмент в backstack с addToBackStack() перед вызовом commit().