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



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



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

533   3  

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

    Ничего не найдено.