Кнопка навигации назад с фрагментами

Я создаю приложение-галерею. Я использую одно действие для хранения фрагмента_1, в котором я отображаю изображения в recyclerview. Из фрагмента_1 я могу перейти к фрагменту_2. Оба фрагмента имеют разные панели инструментов. Я хочу вернуться от фрагмента_2 обратно к фрагменту_1, нажав стрелку назад на панели инструментов.

Как я перехожу от фрагмента_1 к фрагменту_2:

Fragment2 fragment2 = new Fragment2();
    getActivity().getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, fragment2)
            .addToBackStack(null).commit();

То, что я уже делал во фрагменте_2:

Toolbar toolbar = getView().findViewById(R.id.toolbar_2);
    ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowHomeEnabled(true);

Это не сработало:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            getActivity().onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

Находится ли Toolbar в компоновке Activity или каждый Fragment имеет свой собственный Toolbar?

Yupi 20.05.2018 16:13

у каждого фрагмента своя.

llama 20.05.2018 23:06
0
2
490
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Если вы хотите, чтобы onOptionsItemSelected запускался из фрагмента, вам нужно установить setHasOptionsMenu на true, например, из onViewCreated:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
   setHasOptionsMenu(true);
}

Используйте метод popBackStack () для удаления фрагмента из заднего стека. Попробуйте использовать этот код:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            getActivity().getSupportFragmentManager().popBackStack();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
@Override public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            getActivity().getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, new fragment1).commit();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    } }

Если каждый фрагмент имеет Toolbar в собственном макете, вы можете легко получить доступ к Toolbar в onViewCreated после того, как View раздувается в onCreateView. После этого вы можете установить значок навигации и вызвать в setNavigationOnClickListener. Внутри вы можете выбрать один из нескольких подходов: заменить существующий Fragment новым Fragment или существующим removeFragment или использовать popBackStack. В коде это выглядело бы так:

Toolbar toolbar = view.findViewById(R.id.toolbar) // id of your toolbar 
 toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp); // set the back arrow in toolbar 

    //set click listener on back arrow
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            getFragmentManager().popBackStack();
 });

Чтобы использовать этот подход, вам нужно добавить Fragment без нуля в addToBackStack. Например:

getFragmentManager().beginTransaction()
        .add(R.id.container, your fragment here)
        .addToBackStack("BackStack").commit();

Другие вопросы по теме