java - programacion - Espacio flexible en Android
manual de programacion android pdf (1)
Necesitas un NestedScrollView
Puedes ver los siguientes tutoriales:
1. ActionbarMaterialDesign
2. NavigationView
Uso de este tutorial para implementar el patrón de espacio flexible (el que tiene la barra de herramientas contraída).
Estoy tratando de lograr un efecto similar al de la actividad Contactos de Lollipop , que al principio, al ingresar a la actividad, ve solo una parte del encabezado de la imagen:
Luego, el usuario puede desplazarse hacia abajo en el diseño debajo de la imagen para revelar más de ella, hasta que alcance el máximo:
En mi aplicación, no puedo lograr que funcione.
Lo que sucede es que al ingresar a la actividad, el encabezado de la imagen se presenta en su tamaño máximo, el tamaño del AppBarLayout, al igual que el diseño anterior, y a diferencia de la actividad de Contactos de Lollipop , donde se muestra solo una parte de la imagen.
Este es el código que establece la altura de AppBarLayout (quiero que el ancho de la pantalla sea la altura máxima):
int widthPx = getResources().getDisplayMetrics().widthPixels;
AppBarLayout appbar = (AppBarLayout)findViewById(R.id.appbar);
appbar.setLayoutParams(new CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.MATCH_PARENT, widthPx));
Y este es el código que establece el RecyclerView. Intentado con scrollToPosition, pensé que elevaría la vista de RecyclerView, pero no tiene ningún efecto:
mRecyclerView = (RecyclerView) findViewById(R.id.activity_profile_bottom_recyclerview);
mRecyclerView.setHasFixedSize(true);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
// specify an adapter (see also next example)
if(mAdapter == null){
mAdapter = new ProfileAdapter(this, user, inEditMode);
mRecyclerView.setAdapter(mAdapter);
}
mRecyclerView.scrollToPosition(mAdapter.getItemCount() - 1); // itemCount is 4
Este es el diseño xml:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_profile"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="0dp" // set programatically
android:fitsSystemWindows="true"
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"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginBottom="32dp"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/header"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
app:layout_collapseMode="parallax" />
<android.support.v7.widget.Toolbar
android:id="@+id/anim_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/activity_profile_bottom_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
<include
layout="@layout/navigation_view"/>
</android.support.v4.widget.DrawerLayout>
Nota: si me desplazo manualmente, RecyclerView se apaga y revela más de la imagen, simplemente no funciona a través del código.
Creo que scrollToPosition no es la solución, ¿alguien tiene alguna idea?
Pensé en usar la bandera enterAlwaysCollapsed tal como se menciona aquí en la sección CoordinatorLayout y appbar con minHeight:
enterAlwaysCollapsed: cuando su vista haya declarado minHeight y use esta bandera, su vista solo entrará en su altura mínima (es decir, ''colapsada''), solo se volverá a expandir a su altura máxima cuando la vista de desplazamiento haya alcanzado su cima.
Por lo tanto, configuré la bandera scroll | enterAlwaysCollapsed en mi barra de herramientas y minHeight en mi RecyclerView, que no funcionó. Luego intenté mover el minHeight a otros diseños como AppBarLayout, nada funcionó. Simplemente encogía la imagen a veces sin la vista completa.