CollapsingToolbarLayout setTitle () no se actualiza a menos que se haya colapsado

Con la nueva Biblioteca de diseño, se supone que debemos establecer el título de la barra de herramientas en CollapsingToolbarLayout , no en la Toolbar sí (al menos cuando se utiliza la barra de herramientas contraerse). Pero setTitle() solo actualiza el título en las siguientes circunstancias específicas:

1) Cuando el CollapsingToolbarLayout aún no tiene un título

2) En este momento, CollapsingToolbarLayout se colapsa por completo

3) En el momento en que CollapsingToolbarLayout comienza a expandirse

Lo que en realidad bash hacer es convertir el título en EditText cuando esté completamente expandido, lo que permite al usuario darle un nombre a su personaje, que luego se muestra como el título. Intenté forzar el problema llamando a invalidate() o requestLayout() , así como a ambos métodos en los hijos de CollapsingToolbarLayout . Sin efecto.

¿Algunas ideas?

EDITAR: Esta solución ya no es necesaria. error solucionado en v22.2.1

No quería simplemente dejar enlaces así que aquí está la solución completa.

El error ocurre porque el código para manejar el título colapsable solo actualiza el título real si el título actual es nulo o el tamaño del texto ha cambiado. La solución consiste en cambiar el tamaño del texto del título y luego volver a cambiarlo. Usé 0.5 sp así que no hubo demasiado salto. Cambiar el tamaño del texto obliga al texto a actualizarse y no hay parpadeo. solo un ligero cambio de tamaño de texto.

Esto es lo que tengo

 private void setCollapsingToolbarLayoutTitle(String title) { mCollapsingToolbarLayout.setTitle(title); mCollapsingToolbarLayout.setExpandedTitleTextAppearance(R.style.ExpandedAppBar); mCollapsingToolbarLayout.setCollapsedTitleTextAppearance(R.style.CollapsedAppBar); mCollapsingToolbarLayout.setExpandedTitleTextAppearance(R.style.ExpandedAppBarPlus1); mCollapsingToolbarLayout.setCollapsedTitleTextAppearance(R.style.CollapsedAppBarPlus1); } 

en styles.xml tengo

     

Feliz Codificación.

De acuerdo, tengo una solución alternativa mientras esperamos a Google:

  1. Tome la esencia de https://gist.githubusercontent.com/blipinsk/3f8fb37209de6d3eea99/raw/b13bd20ebb319d94399f0e2a0bedbff4c044356a/ControllableAppBarLayout.java (no soy el creador original, pero felicidades al autor original). Esto agrega algunos métodos al AppBarLayout , es decir, expandir y colapsar

  2. En su método que llama a setTitle() :

 collapsingToolbar.setTitle("All Recent"); getSupportActionBar().setTitle("All Recent"); collapseThenExpand(); 
  1. Ahora crea un método collapseThenExpand() :
 private void collapseThenExpand() { appbar.collapseToolbar(); Handler h = new Handler(); h.postDelayed(new Runnable() { @Override public void run() { appbar.expandToolbar(true); } }, 800); } 

Tenga en cuenta que puede desactivar la animación de expansión configurándola en falso.

En mi solución, tuve que establecer el título tanto para la barra de herramientas como para la barra de herramientas para que funcione.

Entonces en OnCreate:

  toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar); 

Y luego, más abajo cuando cambio fragmentos, establezco el título para ambos cuando se selecciona una pestaña:

  public boolean onNavigationItemSelected(@NonNull MenuItem item) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); //TAB1 - THE DEFAULT TAB switch (item.getItemId()) { case R.id.tab_rooms: toolbar.setTitle("My Title"); collapsingToolbar.setTitle("My Title"); fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); fragment = new RoomsFragment(); transaction.replace(R.id.fragment_container, fragment); transaction.addToBackStack(null); transaction.commit(); return true; case R.id.tab_shisha: toolbar.setTitle("My Title2"); collapsingToolbar.setTitle("My Title2"); fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); fragment = new ShishaFragment(); transaction.replace(R.id.fragment_container, fragment); transaction.addToBackStack(null); transaction.commit(); return true; } return false; } 

Espero que ayude a alguien!