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.