В новой библиотеке дизайна есть несколько новых макетов, которые сильно меняют поведение панели инструментов, если разработчик того пожелает. Поскольку разные фрагменты имеют разное поведение и цели, например, фрагмент галереи со сворачивающейся панелью инструментов, показывающий важную фотографию, или фрагмент без прокрутки, которому просто не требуется макет панели приложений для скрытия панели инструментов, наличие одной панели инструментов в действии может оказаться сложно.
Итак, следует ли мне перемещать панель инструментов к каждому фрагменту? Если это так, мне нужно устанавливать supportActionBar каждый раз, когда я показываю фрагмент, а также иметь ссылку на активность во фрагменте, которая сводит на нет независимую природу фрагментов. Если я оставлю панель инструментов только в Activity, мне нужно будет определить несколько макетов для каждого типа поведения в каждом фрагменте. Какой был бы лучший подход?
источник
Ответы:
На мой взгляд, слишком странно иметь панель приложений и тулбар в каждом фрагменте. Поэтому я решил использовать одну панель приложений с активной панелью инструментов.
Чтобы решить эту проблему с помощью CoordinatorLayout, вам нужно будет установить другое поведение вашего
FrameLayout
(или любого другого макета), которое должно содержать фрагменты из каждого фрагмента, который вы хотите переопределить поведение по умолчанию.Предположим, что ваше поведение по умолчанию
app:layout_behavior="@string/appbar_scrolling_view_behavior"
Тогда в вашем fragment_activity_layout.xml у вас может быть что-то вроде этого:
И в каждом фрагменте вы не хотите осуществить ,
app:layout_behavior="@string/appbar_scrolling_view_behavior"
вам придется переопределитьonAttach
иonDetach
методы , которые изменят поведение вашегоFrameLayout
:После этого CoordinatorLayout не будет сворачивать панель приложений и т. Д. И позволит макетам фрагментов быть во всю высоту.
источник
onLoadFinished
, возможно, вы нравится показывать центрированное изображение, уведомляющее, что здесь ничего нет, как в приложении Inbox), но я еще не пробовал этого. Может быть, сегодня позже.enableCoordinator(Activity activity)
/disableCoordinator(Activity activity)
из фрагментов.Вот мое решение
источник
Это действительно хороший вопрос: должны ли
Toolbar
S , что нужно действовать , какActionBar
быть вActivity
илиFragment
? Изучив различные вопросы и документацию, я не смог найти решение, охватывающее все случаи. Поэтому выбор пути зависит от вашей ситуации.Случай 1. Панель инструментов должна быть заменой ActionBar
Если панель инструментов должна вести себя как обычная панель действий (или если время от времени отображается максимум 1 фрагмент), я думаю, что лучший / самый простой способ - использовать традиционный
Activities
с собственной панелью инструментов и поместить туда свой фрагмент. Таким образом, вам не нужно беспокоиться о том, когда какая панель инструментов должна отображаться.Изменение ActionBar (-behaviour) из фрагментов также возможно, но я бы не рекомендовал это, так как это заставляет вас отслеживать, какой фрагмент изменил ActionBar, когда. Я даже не знаю, можно ли настроить ActionBar несколько раз.
Случай 2: каждый фрагмент должен иметь свою (часть) панель инструментов
Вы также можете поместить разные автономные панели инструментов в разные фрагменты с их собственными действиями. Таким образом, вы можете отображать разные фрагменты рядом друг с другом - каждый со своими собственными действиями на своей панели инструментов - и предполагать, что это одна панель инструментов (возможно, как приложение Gmail, хотя я не уверен). Однако это означает, что вам придется раздувать эти панели инструментов самостоятельно, но это не должно быть очень сложно.
Надеюсь, это поможет сделать выбор.
(Извините, если я допустил (языковые) ошибки)
источник