Barra de herramientas plegable: establece la cantidad de barra de herramientas que se debe colapsar en onCreate

Estoy creando un ListView y su aplicación DetailView correspondiente. Mi ListView tiene elementos que, si se hace clic, llevan al usuario a la DetailViewActivity .

En la DetailViewActivity , he implementado una barra de herramientas plegable. Ahora, cada vez que se abre la DetailViewActivity , se establece una imagen diferente (con diferentes dimensiones) en ImageView dentro de la barra de herramientas plegable.

Quiero que la Toolbar debe estar abierta hasta una cierta altura por defecto (por ejemplo, 256dp), pero si la altura de la imagen es mayor que eso, el usuario debe ser capaz de tirar hacia abajo para ver el resto de la imagen. (Exactamente como Whatsapp)

He logrado establecer la altura de la Toolbar de Toolbar cada vez que abro la actividad, pero el problema es que la Toolbar siempre está totalmente expandida. Así que si la imagen es más grande, la barra de herramientas por defecto es muy grande. Quiero que se colapsa a 256dp independientemente de la altura de la imagen.


El código para mi diseño es:

 <RelativeLayout 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:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.CoordinatorLayout android:id="@+id/rootLayout" 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="@dimen/app_bar_height" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsingToolbarLayout" android:layout_width="match_parent" android:layout_height="match_parent" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginStart="@dimen/expanded_toolbar_title_margin_start" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <ImageView android:id="@+id/image" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:src="@drawable/background_navdrawer" app:layout_collapseMode="parallax" app:layout_collapseParallaxMultiplier="0.7"/> <View android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="130dp" android:background="@drawable/gradient_header_background" app:layout_collapseMode="parallax" app:layout_collapseParallaxMultiplier="0.1"/> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v4.widget.NestedScrollView android:id="@+id/detail_nested_scroll_view" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <FrameLayout android:id="@+id/detail_container" android:layout_width="match_parent" android:layout_height="match_parent" tools:ignore="MergeRootFrame"/> </android.support.v4.widget.NestedScrollView> <LinearLayout android:layout_width="match_parent" android:layout_height="12dp" android:orientation="vertical" app:layout_anchor="@+id/appbar" app:layout_anchorGravity="bottom"> <View android:id="@+id/toolbar_shadow_transparent" android:layout_width="match_parent" android:layout_height="@dimen/toolbar_elevation" android:background="@color/transparent"/> <View android:id="@+id/toolbar_shadow" android:layout_width="match_parent" android:layout_height="@dimen/toolbar_elevation" android:background="@drawable/dropshadow"/> </LinearLayout> <com.github.clans.fab.FloatingActionButton android:id="@+id/action_edit" style="@style/MenuButtonsStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:src="@drawable/ic_edit" app:layout_anchor="@+id/appbar" app:layout_anchorGravity="bottom|right|end"/> </android.support.design.widget.CoordinatorLayout> <ImageView android:id="@+id/detail_back_arrow_land" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone"/> <TextView android:id="@+id/course_name_textview" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone"/> </RelativeLayout> 

Y en mi actividad, encontré la altura y la establecí en la Toolbar siguiente manera:

 appBar = (AppBarLayout) findViewById(R.id.appbar); CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams(); lp.height = my_bitmap.getHeight(); DetailActivity.appBar.setLayoutParams(lp); DetailActivity.mImageView.setImageBitmap(my_bitmap); 

Estoy adjuntando capturas de pantalla para hacer mi punto más claro.

Esto es exactamente lo alto que quiero que mi barra de herramientas para ser cada vez que la actividad se lanza: Introduzca aquí la descripción de la imagen

Y esto es lo que obtengo de mi código:

Introduzca aquí la descripción de la imagen

Ahora, podría codificar la altura de 256dp en código, pero entonces el usuario no será capaz de desplazarse hacia abajo para ver el resto de la imagen. Por favor recomiende.

Gracias por su respuesta. Cualquier respuesta podría hacerme empezar

Calculó finalmente la solución. Una vez que recibí la nueva imagen, pasé mi Bitmap como un parámetro a mi método de expandToolbar (). El parámetro heightDp especifica el valor inicial scrolledHeight de la vista. Recibí la idea desde https://stackoverflow.com/a/30747281/3286614 , gracias a Tuấn Trần Anh

 public static void expandToolbar(Bitmap bmp, int heightDp) { CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams(); AppBarLayout.Behavior behavior = new AppBarLayout.Behavior(); behavior.setTopAndBottomOffset(0); behavior.onNestedPreScroll(rootLayout, appBar, null, 0, bmp.getHeight() - heightDp, new int[2]); params.setBehavior(behavior); DetailActivity.appBar.setLayoutParams(params); } 

Espero que esto ayude a alguien.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.