Para mim, parece muito estranho ter appbar e barra de ferramentas em cada fragmento. Portanto, optei por ter uma única barra de aplicativos com barra de ferramentas em atividade.
Para resolver esse problema com o CoordinatorLayout, você terá que definir um comportamento diferente do seu FrameLayout
(ou de qualquer outro Layout) que deveria conter fragmentos de cada fragmento que você deseja substituir o comportamento padrão.
Vamos supor que seu comportamento padrão seja app:layout_behavior="@string/appbar_scrolling_view_behavior"
Então, em seu fragment_activity_layout.xml você pode ter algo assim:
<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>
E em cada fragmento que você não deseja implementar, app:layout_behavior="@string/appbar_scrolling_view_behavior"
você terá que substituir onAttach
e onDetach
métodos que irão mudar o comportamento de seu 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;
}
Depois disso, o CoordinatorLayout não recolherá o appbar etc. e permitirá que os layouts de fragmento tenham altura total.