Пожалуйста, объясните мне ... У меня есть навигационный ящик в моем Activity
, и он синхронизируется с Toolbar
(например, ActionBar
). Активность имеет несколько фрагментов, и в разных фрагментах мне нужно использовать разные режимы AppBar
(параллакс в одном, просто в другом). Итак, я думаю, что я должен установить CoordinatorLayout
в каждом приложении с AppBar и контентом.
Но как я могу заменить последнюю панель инструментов на новую, чтобы сохранить синхронизацию с ящиком? Или это неправильно, и мне нужно сделать что-то еще?Разная панель инструментов для фрагментов и Навигационный ящик
ответ
Если вы используете DrawerLayout
и NavigationView
для навигационного ящика, лучшее решение по мне было бы использовать отдельные DrawerLayout
для каждого из макетов фрагментов и использовать AppBarLayout
в теле DrawerLayout
по-разному для каждого из фрагментов.
Не уверен, что если мой подход хорош, но я пытался добавить публичный метод моей деятельности:
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();
}
Это работает отлично, но я не уверен, может ли это вызвать утечку памяти или любую другую проблему с производительностью. Может быть, кто-то может с этим справиться?
Я решил эту проблему. Просто я использую 'DrawerLayout' в макете действий и' Toolbar' в макетах фрагментов, где в 'onCreateView' устанавливается' Toolbar' как 'ActionBar' и синхронизируется с' DrawerLayout'. –
И ваше решение не имеет утечек памяти) –
@ Шах Вы хотели бы подробнее рассказать о том, как вы синхронизируетесь с 'DrawerLayout' из фрагмента' onCreateView'? Вы заново создаете «ActionBarDrawerToggle» для каждого фрагмента «Панель инструментов»? Вы используете конструктор 'DrawerLayout' с или без,' Панель инструментов'? – jayeffkay
Вы можете получить доступ к основному 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();
Можете ли вы описать деятельность и фрагменты? Все ли фрагменты имеют собственные панели инструментов или используют действия? У меня есть активность с DrawerLayout и NavigationView, внутри которой размещены фрагменты, они содержат CoordinatorLayout, AppBarLayout, Панель инструментов, но это работает плохо, панели инструментов не выглядят так, как я хочу, когда изменяют фрагменты. – CoolMind
Если вы хотите использовать AppBar (панель инструментов), указанный в панели навигации в различных фрагментах с, например, другим меню опций вы можете сделать общедоступный метод в Основной деятельности, где вы указали логику навигационного ящика.
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);
}
Вы можете повторить эту процедуру для других фрагментов в навигационном ящике, а также. Хотя это сработало для меня, я не знаю, нарушает ли это действие или фрагмент жизненного цикла или вызывает покраснение памяти.
Нет-нет, парень, это не проблема. Мне нужно было сделать очень гибкий и сложный графический интерфейс для разных фрагментов. Он требовал полного доступа к панели приложений –
Просто у меня были фрагменты с заголовком параллакса, путь навигации (например, в некоторых ящиках файлов) и т. Д. –
- 1. Навигационный ящик Ниже панели инструментов
- 2. Android Support Library 23.2 - Навигационный ящик и/или панель инструментов
- 3. навигационный ящик и обработчик стопки фрагментов назад
- 4. Навигационный ящик + панель инструментов Меню Lollipop не отвечает
- 5. Как отключить навигационный ящик активности изнутри фрагмента
- 6. Содержание фрагментов накладывается Панель инструментов
- 7. Панель инструментов Android Добавление элементов меню для разных фрагментов
- 8. Панель действий Android и навигационный ящик для нового приложения
- 9. Поместите навигационный ящик ниже панели инструментов и выше TabLayout
- 10. Android Studio - Прозрачная панель действий - Навигационный ящик
- 11. Панель действий, навигационный ящик со списком
- 12. Навигационный ящик слегка перекрывается Панель действий
- 13. Навигация Ящик и панель инструментов с вкладками
- 14. скрывать панель инструментов и ящик на прокрутке
- 15. Навигационный ящик - верхний фрагмент
- 16. Навигационный ящик Использование панели инструментов Tablayout и Collapsing
- 17. Навигационный ящик
- 18. Навигационный ящик 2.3 пряники
- 19. Как построить навигационный ящик?
- 20. Навигационный ящик подразумевает вложенные фрагменты?
- 21. Панель инструментов iOS, не отображающая навигационный контроллер
- 22. Навигационный ящик не закрыт
- 23. Отключите навигационный ящик arrow анимация
- 24. Навигационный ящик с рамкой
- 25. Навигационный ящик и многопозиционный макет
- 26. Как я могу использовать навигационный ящик без фрагментов?
- 27. Направляющий ящик и нижняя панель
- 28. Как добавить навигационный ящик?
- 29. Навигационный ящик для веб-приложения
- 30. Навигационный ящик для заголовка заголовка
Это единственное решение?Мне нужно будет снова подключить почти всю иерархию представлений. –
Вы должны понимать, что вы пытаетесь изменить вид тела, а не родительский вид, потому что AppBarLayout остается встроенным в тело DrawerLayout. Таким образом, лучшей практикой было бы переопределить макет. Если ваш NavigationView идентичен для всех фрагментов, вы можете записать его в отдельный файл макета xml и использовать, который может сократить ваш код. –
Хорошо, спасибо! Просто я думаю, что это решение может занять много времени при переключении фрагментов. Но я буду использовать его. –