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);