Пожалуйста, объясните мне... У меня есть ящик навигации в моем Activity
, и он синхронизируется с Toolbar
(например, ActionBar
). Активность имеет несколько фрагментов, и в разных фрагментах мне нужно использовать разные режимы AppBar
(параллакс в одном, просто в другом). Итак, я думаю, что я должен установить CoordinatorLayout
в каждом frament с помощью AppBar и контента.
Но как я могу заменить последнюю панель инструментов на новую, чтобы сохранить синхронизацию с Drawer? Или это неправильно, и мне нужно сделать что-то еще?
Разная панель инструментов для фрагментов и Навигационный ящик
Ответ 1
Если вы используете DrawerLayout
и NavigationView
для вашего навигационного ящика, лучшим решением по мне будет использование индивидуального DrawerLayout
для каждого из макетов фрагментов и использование AppBarLayout
в теле DrawerLayout
по-разному для каждого из фрагментов.
Ответ 2
Не уверен, что мой подход хорош, но я попытался добавить этот публичный метод в свою деятельность:
public void setToolbar(Toolbar toolbar) {
if(toolbar != null) {
setSupportActionBar(toolbar);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
} else {
drawer.setDrawerListener(null);
}
}
и я добавил это во все фрагменты:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
((MainActivity)getActivity()).setToolbar(toolbar);
}
@Override
public void onDestroyView() {
((MainActivity)getActivity()).setToolbar(null);
super.onDestroyView();
}
Он работает нормально, но я не уверен, может ли это вызвать утечку памяти или любую другую проблему с производительностью. Может быть, кто-то может с этим справиться?
Ответ 3
Вы можете получить доступ к основному DrawerLayout
из каждого Fragment
, как и следующий код:
AppCompatActivity actionBar = (AppCompatActivity) getActivity();
actionBar.setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) actionBar.findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
getActivity(), drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
Ответ 4
Если вы хотите использовать панель инструментов (панель инструментов), указанную вами в навигационном ящике, в разных фрагментах, например, с различными пунктами меню, вы можете сделать общедоступный метод в главной операции, где вы указали логику ящика навигации.
public void setToolbar(Toolbar toolbar, String title){
AppCompatActivity actionBar = this;
actionBar.setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout)actionBar.findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toogle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.drawer_open, R.string.drawer_close);
drawer.addDrawerListener(toogle);
toogle.setDrawerIndicatorEnabled(true);
toogle.syncState();
if(toolbar != null)
toolbar.setTitle(title);
}
Теперь вы можете использовать этот метод в своих фрагментах для доступа к основной панели инструментов и переопределения его с помощью настраиваемого заголовка, меню опций... Вы можете сделать это, создав новую переменную панели инструментов в своем фрагменте, а затем раздуйте ее в методе onCreateView, подобном этому
toolbarFragment = (Toolbar)getActivity().findViewById(R.id.toolbar);
R.id.toolbar - это идентификатор панели инструментов, которую вы указали в вашем файле макета, и это тот же идентификатор, который вы использовали в своей основной деятельности для основной панели инструментов. Теперь вы можете вызвать метод setToolbar (панель инструментов панели инструментов, название строки) в фрагменте, подобном этому
((MainActivity)getActivity()).setToolbar(toolbarFragment, "Some title");
Если вы хотите использовать меню опций для этого фрагмента, вы должны вызвать
setHasOptionsMenu(true);
в методах onCreate() или onCreateView(). После этого вы можете переопределить метод onCreateOptionsMenu() следующим образом
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.custom_menu1, menu);
}
Вы также можете повторить эту процедуру для других фрагментов в вашем навигационном ящике. Хотя это сработало для меня, я не знаю, нарушает ли это действие или фрагмент жизненного цикла или вызывает покрова памяти.