traduccion studio icono botones boton barra bar añadir agregar acciones android android-fragments android-activity android-actionbar

studio - boton action bar android



Diseño de coordinador con barra de herramientas en fragmentos o actividad (3)

Aquí está mi solución.

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

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 diferentes fragmentos tienen diferentes comportamientos y objetivos, por ejemplo, un fragmento de galería con una barra de herramientas colapsada que muestra una foto importante, o un fragmento sin una vista de desplazamiento que simplemente no necesita la barra de herramientas para ocultar la barra de herramientas, tener una sola barra de herramientas en la actividad puede probar difícil

Entonces, con esto, ¿debo mover la barra de herramientas a cada fragmento? Si es así, tengo que establecer 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 solo la barra de herramientas en la Actividad, tengo que tener varios diseños definidos para cada tipo de comportamiento en cada fragmento. ¿Cuál sería el mejor enfoque?


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 sola barra de aplicaciones con barra de herramientas en actividad.

Para resolver ese problema con CoordinatorLayout, deberá establecer un comportamiento diferente de su FrameLayout (o cualquier otro diseño) que supuestamente contenga 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 así:

<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 no desee implementar la app:layout_behavior="@string/appbar_scrolling_view_behavior" deberá anular los métodos onAttach y onDetach que cambiarán 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 fragmentos tengan altura completa.


Esta es una muy buena pregunta: ¿las ActionBar Toolbar que deben actuar como una ActionBar deben mantenerse en una Activity o un Fragment ? Después de buscar diferentes preguntas y documentación, no pude encontrar una solución que cubra todos los casos. Por lo tanto, realmente depende de su situación qué camino tomar.

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 mejor / más simple forma es usar Activities tradicionales con su propia barra de herramientas y poner su fragmento allí. De esta manera, no tiene que preocuparse de cuándo debe mostrarse la barra de herramientas.

También es posible cambiar el ActionBar (-comportamiento) 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 configurar la barra de acciones se puede hacer varias veces.

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

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 es 1 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))