2014-09-25 3 views
8

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

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

}

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

+0

попробуйте добавить вместо замены trans.add (R.id.frag_container, new BasicSettingsFragment()); –

+0

Кроме того, я только заметил, когда вращался экран, что фрагмент меню вообще не удалялся, просто скрывался. Когда я повернул свой телефон, он появился над «BasicSettingsFragment». Добавление @GeorgianBenetatos добавляет только новый фрагмент поверх предыдущего. – jammaster

+0

Вы должны опубликовать полный код MainMenuFragment, все выглядит отлично. –

ответ

2

Ваш код - это смесь, вы используете ActionBarActivity из appcompat и не используете getSupportFragmentManager(), а импорт фрагментов должен быть appcompat, если вы решите его использовать. Если нет, используйте активность вместо ActionBarActivity и простой импорт Фрагмент с FragmentManager

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

+0

Прочитайте комментарии, я решил эту часть. –

+0

Вы должны, вероятно, рекомендовать OP, чтобы опубликовать новый вопрос. –

0

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

+0

Вот что я делаю. Проблема в том, что когда я использую 'replace', он не удаляет старый фрагмент, потому что, когда я поворачиваю экран, он появляется поверх того, что было перед вращением. – jammaster

1

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

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

В вашей активности перезаписи:

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

И, вероятно, вам нужно использовать в каждых порученных сделках фрагмента:

FragmentTransaction.addToBackStack(null); 
Смежные вопросы