with tutorial layout_collapsemode ejemplo coordinator collapsing appbarlayout android android-collapsingtoolbarlayout android-coordinatorlayout

layout_collapsemode - coordinator layout android tutorial



Deje de colapsar la barra de colapsamiento después de que NestedScrollView se quede sin contenido para desplazarse (6)

En Android, ¿cómo puedo hacer que CollapsingToolbar deje de colapsar si NestedScrollView se queda sin contenido para desplazarse? Esta funcionalidad existe actualmente en la aplicación Contactos en Android 5.1.1. Sin embargo, en mi código, cuando NestedScrollView deja de desplazarse, la barra de herramientas continúa colapsando, dejando un espacio entre los dos.

<?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" xmlns:tools="http://schemas.android.com/tools" 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="256dp" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginStart="@dimen/content_padding_normal" app:expandedTitleMarginEnd="64dp"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:titleTextAppearance="@style/ActionBar.TitleText" app:layout_collapseMode="pin" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:scrollbars="none"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingBottom="@dimen/keyline_2"> <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/element_spacing_normal"> <include layout="@layout/ViewLoadingIndeterminate" /> <LinearLayout android:id="@+id/progress_status_container" style="@style/ConnectionFieldContainer" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:orientation="vertical" android:visibility="visible"> <Spinner android:id="@+id/progress_status" android:layout_width="match_parent" style="@style/Text.ConnectionField" /> <TextView style="@style/Text.ConnectionLabel" android:text="@string/mobile.customer.connect.progress.status" /> </LinearLayout> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/element_spacing_normal"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:id="@+id/email1_container" style="@style/ConnectionFieldContainer" android:orientation="horizontal" tools:visibility="visible"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/email1" style="@style/Text.ConnectionField" tools:text="[email protected]" /> <TextView style="@style/Text.ConnectionLabel" android:text="@string/mobile.customer.connect.email1" /> </LinearLayout> <ImageButton android:id="@+id/action_email1" style="@style/Button.ConnectionAction" android:src="@drawable/ic_email_black_24dp" /> </LinearLayout> <LinearLayout android:id="@+id/email2_container" style="@style/ConnectionFieldContainer" android:orientation="horizontal" tools:visibility="visible"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/email2" style="@style/Text.ConnectionField" tools:text="[email protected]" /> <TextView style="@style/Text.ConnectionLabel" android:text="@string/mobile.customer.connect.email2" /> </LinearLayout> <ImageButton android:id="@+id/action_email2" style="@style/Button.ConnectionAction" android:src="@drawable/ic_email_black_24dp" /> </LinearLayout> <LinearLayout android:id="@+id/phone_day_container" style="@style/ConnectionFieldContainer" android:orientation="horizontal" tools:visibility="visible"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/phone_day" style="@style/Text.ConnectionField" tools:text="801-555-1234" /> <TextView style="@style/Text.ConnectionLabel" android:text="@string/mobile.customer.connect.phone.day" /> </LinearLayout> <ImageButton android:id="@+id/action_call_phone_day" style="@style/Button.ConnectionAction" android:src="@drawable/ic_call_black_24dp" /> <ImageButton android:id="@+id/action_text_phone_day" style="@style/Button.ConnectionAction" android:src="@drawable/ic_textsms_black_24dp" /> </LinearLayout> </LinearLayout> </android.support.v4.widget.NestedScrollView> <android.support.design.widget.FloatingActionButton android:id="@+id/create_reminder" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_anchor="@id/collapsing_toolbar" app:layout_anchorGravity="bottom|right|end" app:borderWidth="0dp" app:elevation="@dimen/shadow_size" android:layout_marginBottom="@dimen/keyline_1" android:layout_marginRight="@dimen/keyline_1" android:src="@drawable/ic_alarm_add_white_24dp" app:backgroundTint="?attr/colorAccent" /> </android.support.design.widget.CoordinatorLayout>


Añadir debajo de la línea

android:layout_gravity="fill_vertical"

a su ScrollView anidado


Haz tu NestedScrollView como

<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="fill_vertical" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:scrollbars="none">

CollapsingToolbarLayout se contraerá y los contenidos de NestedScrollView funcionarán como necesites.


Hoy hice un Comportamiento personalizado que hace justamente esto.

Extiende AppBarLayout.ScrollingViewBehavior, por lo que debe configurarse en su vista de desplazamiento (NestedScrollView o lo que sea).

Lo puedes encontrar en Github , hazme saber si funciona.

La parte clave es la programación de la altura colapsada de AppBarLayout en función de la altura del contenido, de modo que cuando termina, el desplazamiento se detiene.


Solo agrega

android:layout_gravity="fill_vertical"

en su NestedScrollView. :)


Sugiero utilizar la solución de natario junto con el código de abajo para evitar el desplazamiento de la aplicaciónBarLayout al desplazarse.

app:scrimVisibleHeightTrigger="?attr/actionBarSize"


Una solución rápida que puede no ser adecuada es, en la creación de actividades, medir la altura de la pantalla y asignarla a su hijo nestedScrollView como minimunHeight. Esto no evitará que la barra de aplicaciones se desplace, pero su contenido se desplazará completamente hacia arriba.

//Calculate screen height in pixels DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); mScreenHeight = displaymetrics.heightPixels; //Get Statusbar size int statusBatHeight = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { mStatusBarHeight = getResources().getDimensionPixelSize(resourceId); } mContainer = (FrameLayout) findViewById(R.id.fragment_container); mContainer.setMinimumHeight(mScreenHeight - mStatusBarHeight);

Otra solución (no la rápida) sería extender NestedScrollView y anular dispatchNestedPreScroll (). Este método se utiliza para indicar al diseño del coordinador que tiene una cierta cantidad de píxeles de desplazamiento. La idea es calcular si ya ha desplazado todos los píxeles y luego llamar a super.dispatchNestedScrollView () o no.

Para calcular si ya ha mostrado todo el contenido, necesitará el tamaño de la pantalla, itere a través de sus hijos para medir el contenido y cuánto ha desplazado.

Las cosas se complican un poco más con la aventura.