Макет координатора с панелью инструментов во фрагментах или активности
с новой библиотекой дизайна есть несколько новых макетов, которые сильно изменяют поведение панели инструментов, если разработчик этого хочет. Поскольку разные фрагменты имеют разное поведение и цели, например фрагмент галереи со свернутой панелью инструментов, показывающей важную фотографию, или фрагмент без scrollview, который просто не нуждается в appbarlayout для скрытия панели инструментов, наличие одной панели инструментов в действии может оказаться трудным.
Так что с этим, я должен переместить панель инструментов на каждый фрагмент? Если это так, я должен установить supportActionBar каждый раз, когда я показываю фрагмент, а также иметь ссылку на активность во фрагменте, которая обнуляет независимую природу фрагментов. Если я оставлю панель инструментов в действии в покое, у меня должно быть несколько макетов, определенных для каждого типа поведения в каждом фрагменте. Каков будет наилучший подход?
3 ответов:
как по мне это звучит слишком странно, чтобы иметь панель приложений и панель инструментов в каждом фрагменте. Поэтому я решил иметь одну панель приложений с панелью инструментов в activity.
чтобы решить эту проблему с CoordinatorLayout вам придется установить другое поведение вашего
FrameLayout(или любой другой макет), который должен удерживать фрагменты из каждого фрагмента, который вы хотите переопределить поведение по умолчанию.предположим, что ваше поведение по умолчанию -
app:layout_behavior="@string/appbar_scrolling_view_behavior"затем в fragment_activity_layout.xml у вас может быть что-то вроде этого:
<android.support.design.widget.CoordinatorLayout android:id="@+id/coordinator" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:id="@+id/dashboard_toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.Toolbar" app:layout_scrollFlags="scroll|enterAlways"/> </android.support.design.widget.AppBarLayout> <FrameLayout android:id="@+id/dashboard_content" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> </android.support.design.widget.CoordinatorLayout>и в каждом фрагменте вы не хотите реализовать
app:layout_behavior="@string/appbar_scrolling_view_behavior"вам придется переопределитьonAttachиonDetachметоды, которые изменят поведение вашегоFrameLayout:CoordinatorLayout.Behavior behavior; @Override public void onAttach(Activity activity) { super.onAttach(activity); if(behavior != null) return; FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams(); behavior = params.getBehavior(); params.setBehavior(null); } @Override public void onDetach() { super.onDetach(); if(behavior == null) return; FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams(); params.setBehavior(behavior); layout.setLayoutParams(params); behavior = null; }после этого CoordinatorLayout не свернет панель приложений и т. д. и позволит фрагмент макетов быть в полный рост.
вот мое решение
<!-- Put your fragment inside a Framelayout and set the behavior for this FrameLayout --> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <!-- Your fragment --> <include layout="@layout/content_main" /> </FrameLayout> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout>
Это действительно хороший вопрос:
ToolbarЧто нужно действовать какActionBarнаходиться вActivityилиFragment? Обыскав различные вопросы и документацию, я не смог найти решение, которое охватывает все случаи. Поэтому это действительно зависит от вашей ситуации, какой путь идти.Случай 1: панель инструментов должна быть заменой ActionBar
Если панель инструментов должна вести себя как обычная панель действий (или если время от времени отображается максимум 1 фрагмент), я думаю, что лучший / самый простой способ - использовать традиционный
ActivitiesС собственной панелью инструментов и поместите туда свой фрагмент. Таким образом, вам не нужно беспокоиться о том, когда должна отображаться панель инструментов.изменение ActionBar (- поведение) из фрагментов также возможно, но я бы не рекомендовал его, так как это заставляет вас отслеживать, какой фрагмент изменил ActionBar, когда. Я даже не знаю, можно ли установить панель действий несколько раз.
Пример 2: каждый фрагмент должен иметь свой собственная (часть) панель инструментов
вы также можете выбрать, чтобы поставить различные автономные панели инструментов в разных фрагментах, с их собственными действиями. Таким образом, вы можете отображать различные фрагменты рядом друг с другом - каждый со своими собственными действиями на своей панели инструментов - и предположить, что это 1 панель инструментов (возможно, как приложение Gmail, хотя я не уверен). Это, однако, означает, что вам придется раздуть эти панели инструментов самостоятельно, но это не должно быть очень сложно.
Я надеюсь, что это поможет сделать выбор.
(Извините, если я сделал какие-либо (языка)ошибки)
Comments