La barra de herramientas se expande deslizando
En mi aplicación tengo una barra de herramientas que se derrumba. Si empiezo un Fragmento específico quiero colapsar la barra de herramientas para que se comporte como una "normal" y que el usuario no puede gastarlo por sí mismo. Aquí está mi diseño que utilizo para mi barra de herramientas:
<android.support.design.widget.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" > <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginEnd="64dp" app:expandedTitleMarginStart="48dp" app:titleEnabled="false" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <ImageView android:src="@drawable/drawer_background" app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" android:layout_width="match_parent" android:layout_height="172dp" android:scaleType="centerCrop" app:layout_collapseMode="parallax" android:minHeight="100dp" /> <android.support.v7.widget.Toolbar android:id="@+id/toolBar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" app:layout_scrollFlags="scroll|enterAlways" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout>
También puedo colapsar el diseño del código de la siguiente manera:
- Barra de herramientas de Android - ¿Cómo implementar Spinner para el modo de navegación?
- ¿Debemos reemplazar la barra de acción por ToolBar?
- Adición de dos barras de herramientas AppCompat con diferentes temas
- Cambiar el color de la barra de herramientas en Appcompat 21
- Barra de herramientas para fragmentos y Gaveta de navegación
appBarLayout.setExpanded(false, false); final AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) collapsingToolbarLayout.getLayoutParams(); params.setScrollFlags(0); collapsingToolbarLayout.setLayoutParams(params);
Pero esto no ayuda. Si el usuario pasa de la barra de herramientas se expandirá.
¿Tienes alguna idea de por qué?
- Altura de la barra de herramientas de Android al desplazarse
- Quitar el botón de nuevo de SearchView en la barra de herramientas AppCompat
- Pantalla completa Con la barra de herramientas y edittext en la parte inferior de Android
- Obtención de la barra de herramientas en el fragmento
- Barra de herramientas transparente para la barra de herramientas de despliegue agotada
- Sincronizar la altura de la barra de herramientas con ViewPager
- ¿Cómo ocultar la barra de herramientas mientras se desplaza listview? (Al igual que google play tienda)
- AppBarLayout con contenedor FrameLayout como contenido de desplazamiento no funciona
El problema central es que no hay CollapsingToolbarLayout.lock();
Hasta ahora (v23.2.1 del diseño de soporte). Esperemos que esta característica se incluirá en una versión futura. Hasta entonces, estoy sugiriendo la siguiente solución:
Puedes contraer y bloquear tu barra de herramientas con:
appbar.setExpanded(false,false); CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams(); lp.height = (int) getResources().getDimension(R.dimen.toolbar_height);
Y desbloquearlo con:
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams(); lp.height = (int) getResources().getDimension(R.dimen.nav_header_height);
Sin embargo, con el código anterior se produce un problema:
Cuando se desploma con fuerza CoordinatorLayout el título de nuestra barra de herramientas ha desaparecido y CollapsingToolbarLayout.setTitle(CharSequence title);
Ya no funciona. Para corregir que agregamos un TextView en nuestra barra de herramientas y manipular su visibilidad en consecuencia. (Lo queremos "ido" en un fragmento que tiene su barra de herramientas 'desbloqueada' y 'visible' en un fragmento que tiene su barra de herramientas 'bloqueada'.
Tenemos que configurar TextView's android:textAppearance
para que sea igual con la app:collapsedTitleTextAppearance
CollapsingToolbarLayout app:collapsedTitleTextAppearance
para ser coherente y evitar interrumpir al usuario con diferentes tamaños y colores de texto de barra de herramientas.
En resumen, con una interfaz como esta:
public interface ToolbarManipulation { void collapseToolbar(); void expandToolbar(); void setTitle(String s); }
Implementaciones como estas:
@Override public void collapseToolbar(){ appbar.setExpanded(false,false); CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams(); lp.height = (int) getResources().getDimension(R.dimen.toolbar_height); toolbarCollapsedTitle.setVisibility(View.VISIBLE); } @Override public void expandToolbar() { CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams(); lp.height = (int) getResources().getDimension(R.dimen.nav_header_height); toolbarCollapsedTitle.setVisibility(View.GONE); } @Override public void setTitle(String s) { collapsingToolbarLayout.setTitle(s); toolbarCollapsedTitle.setText(s); collapsingToolbarLayout.invalidate(); toolbarCollapsedTitle.invalidate(); }
Y xml principal como este:
.... <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:layout_scrollFlags="scroll|exitUntilCollapsed" app:collapsedTitleTextAppearance="@style/CollapsedAppBar" > <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_collapseMode="pin" app:popupTheme="@style/AppTheme.PopupOverlay" > <TextView android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:visibility="gone" android:layout_gravity="center_vertical|start" android:gravity="center_vertical|start" android:id="@+id/toolbar_collapsed_title" android:textAppearance="@style/CollapsedAppBar" /> </android.support.v7.widget.Toolbar> </android.support.design.widget.CollapsingToolbarLayout> ......
Puedes bloquear y desbloquear tu barra de herramientas como quieras. Tus fragmentos deben llamar a estas funciones en su onResume ();
He subido una implementación de ejemplo aquí .
Nota: Esto es sólo una solución y, obviamente, no es la solución más limpia. Estamos esperando una versión más reciente de com.android.support para resolver esto.
No estoy exactamente seguro de si esto es lo que buscas
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior(); behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() { @Override public boolean canDrag(@NonNull AppBarLayout appBarLayout) { return false; } });
Trate de cambiar la altura de la AppBar. Esto funciona para mi.
public void lockAppBar() { int appbarHeight = (int)getResources().getDimension(R.dimen.your_fixed_appbar_height); getView().findViewById(R.id.my_appbar).getLayoutParams().height = appbarHeight; }
Hacer findViewById(R.id.image_view).setVisibility(View.GONE);
Donde image_view
es el id de la imageView en la barra de herramientas de contracción . Pero si usted quiere hacerlo para un fragmento específico, sugiero llamar a la misma usando la comunicación de actividad de fragmentos.
Ninguna de las soluciones proporcionadas funcionó para mí excepto esta. Con esta solución, puedo manejar fácilmente el estado de colapso de la barra de herramientas. Esto evitará expandir / permitir el colapso de la barra de herramientas de contracción y establecer el título de la misma.
public void lockAppBar(boolean locked,String title) { if(locked){ appBarLayout.setExpanded(false, true); int px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 80, getResources().getDisplayMetrics()); CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appBarLayout.getLayoutParams(); lp.height = px; appBarLayout.setLayoutParams(lp); collapsingToolbarLayout.setTitleEnabled(false); toolbar.setTitle(title); }else{ appBarLayout.setExpanded(true, false); appBarLayout.setActivated(true); CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); lp.height = (int) getResources().getDimension(R.dimen.toolbarExpandHeight); collapsingToolbarLayout.setTitleEnabled(true); collapsingToolbarLayout.setTitle(title); } }
Bueno intentar establecer algunos parámetros a toolBar, tabLayout programatically, Tengo ViewPager
cambiando flags on onPageSelected (int)
@Override public void onPageSelected(int position) { AppBarLayout.LayoutParams params = new AppBarLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); if (position == 3) {//listen for scrolls only for Fragment 3 params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS); toolBar.setLayoutParams(params);//hide as per scroll params = new AppBarLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS); tabLayout.setLayoutParams(params);//always visible } else { appBarLayout.setExpanded(false, true); params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED); toolBar.setLayoutParams(params);//don't listen to scrolls tabLayout.setLayoutParams(params);//dont listen to scrolls } }
Utilice / Establezca sobre los indicadores como lo requiera. AppBarLayout.LayoutParams
Happy_Coding;
- Android: cómo cambiar el estilo de editar texto?
- ¿Qué significa que el informe de error se haya capturado en la tableta Android?