web-dev-qa-db-fra.com

Mise en page du coordinateur avec barre d'outils en fragments ou en activité

Avec la nouvelle bibliothèque de conception, plusieurs nouvelles dispositions changent considérablement le comportement de la barre d’outils si le développeur le souhaite. Puisque différents fragments ont des comportements et des objectifs différents, par exemple un fragment de galerie avec une barre d'outils réductrice montrant une photo importante, ou un fragment sans vue de défilement qui n'a simplement pas besoin de la barre d'application pour masquer la barre d'outils. se révéler difficile.

Donc, avec cela, devrais-je déplacer la barre d'outils vers chaque fragment? Si c'est le cas, je dois définir le supportActionBar à chaque fois que je montre un fragment et que j'ai également une référence de l'activité dans le fragment, ce qui annule la nature indépendante des fragments. Si je quitte la barre d'outils uniquement dans l'activité, je dois définir plusieurs dispositions pour chaque type de comportement de chaque fragment. Quelle serait la meilleure approche?

92
mobilepotato7

En ce qui me concerne, cela semble trop bizarre d’avoir une barre d’application et une barre d’outils dans chaque fragment. J'ai donc choisi d'avoir une barre d'applications unique avec une barre d'outils en activité.

Pour résoudre ce problème avec CoordinatorLayout, vous devez définir un comportement différent de votre FrameLayout (ou de toute autre mise en page) censé contenir des fragments de chaque fragment dont vous souhaitez remplacer le comportement par défaut.

Supposons que votre comportement par défaut est app:layout_behavior="@string/appbar_scrolling_view_behavior"

Ensuite, dans votre fragment_activity_layout.xml, vous pouvez avoir quelque chose comme ça:

<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>

Et dans chaque fragment, vous ne souhaitez pas implémenter app:layout_behavior="@string/appbar_scrolling_view_behavior" vous devrez remplacer les méthodes onAttach et onDetach qui modifieront le comportement de votre 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;
}

Après cela, CoordinatorLayout ne réduira pas la barre d’application, etc., et permettra aux présentations de fragments de prendre toute la hauteur.

52

Voici ma solution

<!-- 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

C'est une très bonne question: faut-il que Toolbars qui doivent agir comme un ActionBar soit conservé dans un Activity ou un Fragment? Après avoir recherché différentes questions et documentations, je n’ai pas trouvé de solution couvrant tous les cas. Cela dépend donc vraiment de votre situation.

Cas 1: la barre d’outils doit être un remplacement de la barre d’action

Si la barre d’outils doit se comporter comme une barre d’action normale (ou si 1 fragment maximum est affiché de temps en temps), je pense que le meilleur moyen est d’utiliser la méthode traditionnelle Activities avec sa propre barre d’outils et de placer votre fragment dans Là. De cette façon, vous n'avez pas à vous demander quand la barre d'outils doit être affichée.

Changer le ActionBar (- comportement) de Fragments est également possible, mais je ne le recommanderais pas, car cela vous oblige à garder trace du fragment qui a changé le ActionBar quand. Je ne sais même pas si le réglage de la barre d’action peut être effectué plusieurs fois.

Cas 2: Chaque fragment devrait avoir sa propre barre d’outils

Vous pouvez également choisir de placer différentes barres d’outils autonomes dans différents fragments, avec leurs propres actions. De cette façon, vous pouvez afficher différents fragments côte à côte - chacun avec leurs propres actions dans leur barre d'outils - et suggérer qu'il s'agisse d'une barre d'outils (peut-être comme l'application Gmail, bien que je ne sois pas sûr). Cela signifie toutefois que vous devrez gonfler ces barres d’outils vous-même, mais cela ne doit pas être très difficile.

J'espère que cela aidera à faire un choix.

(Désolé si j'ai commis des erreurs de langue)

1
Coen B