layout_collapsemode collapsing appbar_scrolling_view_behavior android android-toolbar android-design-library android-coordinatorlayout

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.

Enlace al documento


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>