appbar_scrolling_view_behavior - collapsing toolbar android
AppBarLayout con contenedor FrameLayout como contenido de desplazamiento no funciona (10)
Estoy intentando usar la biblioteca de diseño más nueva para hacer que mi barra de herramientas se oculte / muestre en desplazamiento. Mi problema es que el contenido de desplazamiento que tengo está en el fragmento, solo lo estoy inyectando en el contenedor de FrameLayout y no funciona. Aquí está mi actividad:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<include layout="@layout/layout_toolbar" />
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
<FrameLayout
android:id="@+id/navigation_drawer_container"
android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
tools:layout="@layout/fragment_nav_drawer_anon" />
y mi fragmento:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/pull_to_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.v4.widget.SwipeRefreshLayout>
<TextView
android:id="@android:id/empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="18sp"
android:fontFamily="sans-serif"
android:color="@color/dark_grey"
android:padding="60dp"/>
y barra de herramientas:
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways"
style="@style/Widget.MyApp.ActionBar" />
Estoy siguiendo el doc oficial y esta demo , y todavía no puedo encontrar la manera de hacerlo funcionar.
Debe agregar comportamiento a la vista de desplazamiento:
<android.support.v4.widget.SwipeRefreshLayout
android:layout_marginTop="5dp"
android:id="@+id/swipe_main"
android:enabled="false"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<com.marshalchen.ultimaterecyclerview.UltimateRecyclerView
android:id="@+id/rvUserProfile"
app:recyclerviewEmptyView ="@layout/ev_home"
app:recyclerviewClipToPadding="false"
android:layout_width="match_parent"
android:layout_height="match_parent"></com.marshalchen.ultimaterecyclerview.UltimateRecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
En mi aplicación, solo funciona con RecyclerView. Tal vez deberías usar RecyclerView en lugar de ListView.
Es una buena pregunta. Yo también tuve lo mismo.
Su contenedor FrameLayout
se define correctamente, el problema radica en el Fragment
. El Fragment
debería tener RecyclerView
y no ListView
ya que ahora está en desuso.
Ejemplo:
<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingTop="@dimen/activity_vertical_margin"/>
Uso la misma estructura en mi aplicación y funciona perfecto.
La razón de ese comportamiento es que Framelayout no especifica un Comportamiento. El CoordinatorLayout se basa en la vista secundaria para manejar el Comportamiento.
Puedes leer en la parte inferior aquí
http://android-developers.blogspot.in/2015/05/android-design-support-library.html
Se afirma que
CoordinatorLayout y vistas personalizadas
Una cosa que es importante tener en cuenta es que CoordinatorLayout no tiene ninguna comprensión innata de un trabajo de FloatingActionButton o AppBarLayout; solo proporciona una API adicional en forma de un Coordinator.Behavior, que permite que las vistas de los niños controlen mejor los eventos táctiles y los gestos así como declarar dependencias entre sí y recibir devoluciones de llamada a través de onDependentViewChanged ().
Las vistas pueden declarar un comportamiento predeterminado mediante la anotación CoordinatorLayout.DefaultBehavior (YourView.Behavior.class) o establecerlo en los archivos de diseño mediante el atributo app: layout_behavior = "com.example.app.YourView $ Behavior". Este marco hace posible que cualquier vista se integre con CoordinatorLayout.
Editar: aunque FrameLayout no es una vista personalizada, no especifica un comportamiento que busca CoordinateLayout.
ListView no implementa NestedScrollingChild por lo que no funciona.
RecyclerView lo hace, por lo que puede propagar el desplazamiento a NestedScrollingParent (CoordinatorLayout).
Mueva la app:layout_scrollFlags="scroll|enterAlways"
desde la barra de herramientas a Framelayout. Perdón por llegar tarde.
Puede lograr el desplazamiento con Framelayout dentro de su CoordinatorLayout. Para ello, debe usar la app:layout_behavior="@string/appbar_scrolling_view_behavior"
dentro de su frameLayout
, así como dentro de la vista de desplazamiento con la que desea este efecto de colapso.
Por ejemplo, si está inflando RecyclerView dentro de su frameLayout, entonces debe usar la app:layout_behavior="@string/appbar_scrolling_view_behavior"
dentro de su recyclerrView también.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
</Relativelayout>
o,
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/bNext"
android:fillViewport="true"
android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<!-- your content -->
</android.support.v4.widget.NestedScrollView>
</Relativelayout>
Por lo tanto, al usar este proceso, puede lograr desplazarse con frameLayout, ya sea que contenga recycler o nestedScrollview.
Reemplace su FrameLayout con android.support.v4.widget.NestedScrollView
NestedScrollView es como ScrollView, pero admite actuar tanto como un elemento principal desplazable anidado como secundario en versiones nuevas y antiguas de Android. El desplazamiento anidado está habilitado por defecto.
Solo necesitas reemplazar
FrameLayout
a
android.support.v4.widget.NestedScrollView
De este modo:
<android.support.design.widget.CoordinatorLayout
android:id="@+id/root_coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentScrim="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways">
<ImageView
android:layout_width="match_parent"
android:layout_height="192dp"
android:scaleType="centerCrop"
android:src="@drawable/header"
app:layout_collapseMode="parallax" />
<android.support.v7.widget.Toolbar
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<!-- This was before FrameLayout -->
<android.support.v4.widget.NestedScrollView
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</android.support.v4.widget.NestedScrollView>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_margin="16dp"
android:src="@drawable/ic_drawer_alertas"
app:borderWidth="0dp"
app:fabSize="mini" />
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation_drawer"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:itemIconTint="@color/colorAccent"
app:itemTextColor="@color/colorSecondaryText"
app:menu="@menu/menu_main" />
Usar FrameLayout como hijo de CoordinatorLayout funciona bastante bien. La barra de herramientas se está colapsando como se supone que debe hacerlo. Al principio tuve un problema cuando usaba bibliotecas desactualizadas.
Estas son las dependencias de Gradle que estoy usando en este momento:
compile ''com.android.support:appcompat-v7:22.2.1''
compile ''com.android.support:cardview-v7:22.2.0''
compile ''com.android.support:recyclerview-v7:22.2.0''
compile ''com.android.support:design:22.2.0''
Estoy utilizando FrameLayout
con la app:layout_behavior="@string/appbar_scrolling_view_behavior"
atributos app:layout_behavior="@string/appbar_scrolling_view_behavior"
como elemento secundario de CoordinatorLayout
en el diseño de una actividad. FrameLayout
sirve como contenedor de fragmentos. Los elementos raíz de mis diseños de fragmentos son un RecyclerView
o un NestedScrollView
.
Aquí está el diseño de la actividad:
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<FrameLayout
android:id="@+id/..."
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
<android.support.design.widget.AppBarLayout
android:layout_height="192dp"
android:layout_width="match_parent"
>
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
>
<ImageView
android:id="@+id/.."
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
android:src="@drawable/..."
app:layout_collapseMode="parallax"/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_sessions"
android:layout_height="?attr/actionBarSize"
android:layout_width="match_parent"
app:layout_collapseMode="pin"
/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>
El diseño de mi primer fragmento se ve así:
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="..."
/>
El diseño de mi segundo fragmento tiene este aspecto:
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="..."
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="..."
>
...
</android.support.v4.widget.NestedScrollView>