Я создаю приложение-галерею. Я использую одно действие для хранения фрагмента_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);
}
}
у каждого фрагмента своя.
Если вы хотите, чтобы 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();
Находится ли
Toolbarв компоновкеActivityили каждыйFragmentимеет свой собственныйToolbar?