android layout android-viewpager coordinator-layout

Android CoordinatorLayout+AppbarLayout+Viewpager siempre en desplazamiento



android-viewpager coordinator-layout (8)

Acabo de tener el mismo problema. La solución es muy simple, solo configure la altura de su visor

android:layout_height="wrap_content"

Tengo un diseño clásico con una barra de herramientas en la parte superior, un TabLayout debajo de él y un ViewPager que cambia pestañas del TabLayout. Cuando el contenido en ViewPager es desplazable, la barra de herramientas debe desplazarse fuera de la vista, y el TabLayout debe seguir y pegarse cuando llegue a la parte superior.

Todo esto es bueno en mi código actual, excepto que ToolBar siempre es desplazable, independientemente del tamaño del contenido de ViewPager. Ver mi código a continuación. ¿Alguna idea brillante sobre cómo solucionar esto?

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout 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.design.widget.AppBarLayout android:id="@+id/app_bar_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/primary" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/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.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:scrollbars="horizontal" app:tabIndicatorColor="@color/black_text" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/tabs_activity_view_pager" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout>

EDITAR:

Puedo ver que la altura de viewPager es la misma que la altura para la vista raíz completa. Esto podría ser intencionado, ya que la appbar_scrolling_view_behavior parece agregar una compensación superior e inferior. Sin embargo, parece extraño, ya que siempre se desplazará por la barra de herramientas y tabbar.


En base a otras muestras, mi propio código y el código fuente (algo desordenado) de la appbar_scrolling_view_behavior:

public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { final CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) dependency.getLayoutParams()).getBehavior(); if (behavior instanceof Behavior) { // Offset the child so that it is below the app-bar (with any overlap) final int appBarOffset = ((Behavior) behavior) .getTopBottomOffsetForScrollingSibling(); final int expandedMax = dependency.getHeight() - mOverlayTop; final int collapsedMin = parent.getHeight() - child.getHeight(); if (mOverlayTop != 0 && dependency instanceof AppBarLayout) { // If we have an overlap top, and the dependency is an AppBarLayout, we control // the offset ourselves based on the appbar''s scroll progress. This is so that // the scroll happens sequentially rather than linearly final int scrollRange = ((AppBarLayout) dependency).getTotalScrollRange(); setTopAndBottomOffset(AnimationUtils.lerp(expandedMax, collapsedMin, Math.abs(appBarOffset) / (float) scrollRange)); } else { setTopAndBottomOffset(dependency.getHeight() - mOverlayTop + appBarOffset); } } return false; }

Estoy leyendo esto de una manera que explica el problema, ya que este es el comportamiento esperado con este código.

Creo que tenemos que escribir nuestro propio comportamiento de desplazamiento, especialmente para RecyclerView,


He resuelto el problema, intenté con la plantilla de Google de ejemplo y descubrí que

app:layout_behavior="@string/appbar_scrolling_view_behavior"

la línea se debe agregar a las propiedades del buscapersonas xml. Solucionó mi problema.


Intente agregar estos atributos en TabLayout:

app:layout_collapseMode="pin" app:tabMode="fixed"

Y esto en AppBarLayout:

android:fitsSystemWindows="true"

* ACTUALIZACIÓN *

Intenté y esto no es suficiente, ya que la barra de herramientas aún se puede desplazar. La solución es hacer un poco de lógica sobre ViewPager (y su contenido).

Elimine del archivo de diseño xml la barra de herramientas atributo scroll_flag. Debe implementar algún código de Java para verificar si la altura del contenido de ViewPager es> entonces screenHeight - (barra de herramientas + tabBar). Si es verdadero, establezca programáticamente scroll_flags como este:

LayoutParams params; params = // get layout params from your toolbar params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS); // set params toolbar.setLayoutParams(params);


La altura de ViewPager debe ser match_parent y no wrap_content .


La solución simple es: ajuste el diseño de la barra de aplicaciones y el visor de páginas con un diseño relativo. - dale a tu diseño de la barra de aplicaciones una identificación - en la vista de la página establece android: layout_below = "Your_appbar_layout" Por ejemplo:

<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:id="@+id/your_appBar_ID" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/primary" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/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.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:scrollbars="horizontal" app:tabIndicatorColor="@color/black_text" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/tabs_activity_view_pager" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/your_appBar_ID" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </RelativeLayout>


Le sugerí que pruebe this muestra.

este es un diseño como su diseño en la muestra.

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/main_content" 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:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:layout_scrollFlags="scroll|enterAlways" /> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end|bottom" android:layout_margin="@dimen/fab_margin" android:src="@drawable/ic_done" /> </android.support.design.widget.CoordinatorLayout>


usando ListView como datos para ViewPager? Si es así, necesita listView.setNestedScrollingEnabled(true);