Diseño del coordinador con barra de herramientas en fragmentos o actividad

94

Con la nueva biblioteca de diseño, hay varios diseños nuevos que cambian mucho el comportamiento de la barra de herramientas si el desarrollador así lo desea. Dado que los diferentes fragmentos tienen diferentes comportamientos y objetivos, por ejemplo, un fragmento de galería con una barra de herramientas que se colapsa que muestra una foto importante, o un fragmento sin una vista de desplazamiento que simplemente no necesita el diseño de la barra de aplicaciones para ocultar la barra de herramientas, tener una sola barra de herramientas en la actividad puede resultar difícil.

Entonces, con esto, ¿debería mover la barra de herramientas a cada fragmento? Si es así, tengo que configurar supportActionBar cada vez que muestro un fragmento y también tengo una referencia de la actividad en el fragmento que anula la naturaleza independiente de los fragmentos. Si dejo la barra de herramientas en la Actividad sola, tengo que tener varios diseños definidos para cada tipo de comportamiento en cada fragmento. ¿Cuál sería el mejor enfoque?

mobilepotato7
fuente
1
Hola, encontraste una solución?
SERG
2
para mi proyecto actual, he decidido seguir con la barra de herramientas en la Actividad y hacer las animaciones adecuadas cuando sea necesario. Pero es un poco complicado. Intenté usar la barra de herramientas en cada fragmento y funciona bien, pero animar la barra de herramientas entre las transiciones de los fragmentos es más difícil y ni siquiera sé si es posible porque no tengo mucha experiencia con las animaciones de las transiciones de los fragmentos.
mobilepotato7
¿Alguna actualización o mejor solución para esto ahora?
Sagar Nayak

Respuestas:

56

En cuanto a mí, suena demasiado extraño tener una barra de aplicaciones y una barra de herramientas en cada fragmento. Así que elegí tener una barra de aplicaciones única con la barra de herramientas en actividad.

Para resolver ese problema con CoordinatorLayout, tendrá que establecer un comportamiento diferente de su FrameLayout(o cualquier otro diseño) que se supone que contiene fragmentos de cada fragmento que desea anular el comportamiento predeterminado.

Supongamos que su comportamiento predeterminado es app:layout_behavior="@string/appbar_scrolling_view_behavior"

Luego, en su fragment_activity_layout.xml, puede tener algo como eso:

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

Y en cada fragmento que desea no aplicar app:layout_behavior="@string/appbar_scrolling_view_behavior"tendrá que anular onAttachy onDetachmétodos que van a cambiar el comportamiento de su 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;
}

Después de eso, CoordinatorLayout no colapsará la barra de aplicaciones, etc. y permitirá que los diseños de los fragmentos sean de altura completa.

Клаус Шварц
fuente
Bonito, tendré que probar esto y ver si simplifica las cosas. Gracias.
mobilepotato7
Si encuentra algo más simple, hágamelo saber. Creo que es posible cambiar el comportamiento del coordinador en cualquier momento durante el ciclo de vida de los fragmentos (por ejemplo, normalmente tiene un reciclador con algunas cosas, pero en casos raros puede estar vacío y sabrá que solo después de Loader onLoadFinished, es posible que me gusta mostrar una imagen centrada notificando que no hay nada aquí, como en la aplicación Inbox), pero aún no lo intenté. Quizás hoy más tarde.
Клаус Шварц
Ok, eso funciona bastante bien. Creé un ayudante que se encarga de habilitar / deshabilitar al coordinador cuando sea apropiado, así que solo llamo enableCoordinator(Activity activity)/ disableCoordinator(Activity activity)desde fragmentos.
Клаус Шварц
¿Dónde está tu ayudante, @ КлаусШварц? ¿Cuándo lo llamas?
santhyago
1
@santhyago en el fragmento
Клаус Шварц
8

Esta es mi solucion

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

Charles-Eugene Loubao
fuente
1

Esta es una muy buena pregunta: ¿deberían mantenerse en una o en una Toolbars esa necesidad de actuar como una ? Habiendo buscado diferentes preguntas y documentación, no pude encontrar una solución que cubriera todos los casos. Por lo tanto, realmente depende de su situación qué camino tomar.ActionBarActivityFragment

Caso 1: la barra de herramientas debe ser un reemplazo de ActionBar

Si la barra de herramientas tiene que comportarse como una barra de acción normal (o si se muestra un máximo de 1 fragmento de vez en cuando), creo que la forma mejor / más sencilla es usar tradicional Activitiescon su propia barra de herramientas y poner su fragmento allí. De esta forma, no tiene que preocuparse de cuándo debe mostrarse qué barra de herramientas.

También es posible cambiar el ActionBar (-behaviour) de Fragments, pero no lo recomendaría, ya que eso te obliga a realizar un seguimiento de qué Fragment cambió el ActionBar cuando. Ni siquiera sé si la configuración de ActionBar se puede hacer varias veces.

Caso 2: cada fragmento debe tener su propia barra de herramientas (parte de ella)

También puede optar por colocar diferentes barras de herramientas independientes en diferentes fragmentos, con sus propias acciones. De esta manera, podría mostrar diferentes Fragmentos uno al lado del otro, cada uno con sus propias acciones en su barra de herramientas, y sugerir que sea una barra de herramientas (tal vez como la aplicación Gmail, aunque no estoy seguro). Sin embargo, esto significa que tendría que inflar esas barras de herramientas usted mismo, pero no debe ser muy difícil.

Espero que esto ayude a tomar una decisión.

(Lo siento si cometí algún error de (idioma))

Coen B
fuente
4
lo siento, pero esto realmente no responde a los problemas relacionados con la nueva biblioteca de diseño. Seguro que el objetivo es tener la barra de herramientas como barra de acciones, pero tener varios diseños de coordinador para diferentes tipos de barras de herramientas puede ser complicado. Lo que encontré es que es posible animar la barra de herramientas según sea necesario. Todavía necesito probarlo mejor, pero parece que hay buenos resultados
mobilepotato7