it-swarm.com.ru

Расположение координаторов с панелью инструментов в фрагментах или действиях

С новой библиотекой дизайна появилось несколько новых макетов, которые сильно меняют поведение панели инструментов по желанию разработчика. Поскольку разные фрагменты имеют разное поведение и цели, например, фрагмент галереи с сворачивающейся панелью инструментов, на которой показана важная фотография, или фрагмент без скролл-просмотра, которому просто не нужна панель приложений для скрытия панели инструментов, наличие единственной панели инструментов в действии может доказать сложно.

Так с этим, я должен переместить панель инструментов к каждому фрагменту? Если это так, я должен устанавливать supportActionBar каждый раз, когда я показываю фрагмент, а также иметь ссылку на активность во фрагменте, которая сводит на нет независимую природу фрагментов. Если я оставлю панель инструментов в "Деятельности" в одиночку, мне нужно будет определить несколько макетов для каждого типа поведения в каждом фрагменте. Какой будет лучший подход?

92
mobilepotato7

Что касается меня, это звучит слишком странно, чтобы иметь панель приложений и панель инструментов в каждом фрагменте. Поэтому я выбрал единую панель приложений с панелью инструментов в действии.

Чтобы решить эту проблему с помощью CoordinatorLayout, вам нужно установить другое поведение вашего FrameLayout (или любого другого макета), который должен содержать фрагменты из каждого фрагмента, который вы хотите переопределить по умолчанию.

Предположим, что ваше поведение по умолчанию app:layout_behavior="@string/appbar_scrolling_view_behavior"

Тогда в вашем фрагменте_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 не свернет панель приложений и т.д. И позволит макетам фрагментов быть в полный рост.

51
Клаус Шварц

Вот мое решение

<!-- 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>
6
Charles-Eugene Loubao

Это действительно хороший вопрос: должны ли Toolbars, которые должны действовать как ActionBar, храниться в Activity или Fragment? Обыскав различные вопросы и документацию, я не смог найти решение, которое бы охватывало все случаи Поэтому это действительно зависит от вашей ситуации.

Случай 1: панель инструментов должна быть заменена ActionBar

Если панель инструментов должна вести себя как обычный ActionBar (или если время от времени показывается максимум 1 фрагмент), я думаю, что лучший/самый простой способ - использовать традиционное Activities с собственной панелью инструментов и поместить туда свой фрагмент. Таким образом, вам не нужно беспокоиться о том, когда какая панель инструментов должна быть показана.

Изменение ActionBar (-behaviour) из Fragments также возможно, но я бы не рекомендовал его, поскольку это заставляет вас отслеживать, какой фрагмент изменил ActionBar, когда. Я даже не знаю, можно ли установить ActionBar несколько раз.

Случай 2: Каждый фрагмент должен иметь свою собственную (часть) панели инструментов

Вы также можете разместить разные отдельные панели инструментов в разных фрагментах с собственными действиями. Таким образом, вы можете отобразить различные фрагменты рядом друг с другом - каждый со своими действиями на своей панели инструментов - и предположить, что это 1 панель инструментов (может быть, как приложение Gmail, хотя я не уверен). Это, однако, означает, что вам придется самостоятельно раздувать эти панели инструментов, но это не должно быть очень сложно.

Я надеюсь, что это поможет сделать выбор.

(Извините, если я сделал какие-либо (языковые) ошибки)

1
Coen B