Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CollapsingToolbarLayout setTitle() does not update unless collapsed

With the new Design Library, we're supposed to set the toolbar title on the CollapsingToolbarLayout, not the Toolbar itself(at least when using the collapsing toolbar). But setTitle() only updates the title in the following specific circumstances:

  1. When the CollapsingToolbarLayout does not have a title yet

  2. At the moment the CollapsingToolbarLayout becomes fully collapsed

  3. At the moment the CollapsingToolbarLayout starts to expand

What I'm actually trying to do is make the title become an EditText when fully expanded, allowing the user to give his/her character a name, which then displays as the title. I've tried to force the issue by calling invalidate() or requestLayout(), as well as both of those methods on CollapsingToolbarLayout's children. No effect.

like image 818
Jim Pekarek Avatar asked Jun 06 '15 11:06

Jim Pekarek


2 Answers

EDIT: This solution is no longer needed. bug fixed in v22.2.1

I didnt want to just leave links so here is the full solution.

The bug occurs because the code to handle the collapsable title only updates the actual title if the current title is null or the text size has changed. The workaround is to change the title text size and then change it back. I used 0.5 sp so there was not too much of a jump. Changing the text size forces the text to be updated and there is no flicker. just a slight text size change.

This is what I have

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); } 

in styles.xml I have

<style name="ExpandedAppBar" parent="@android:style/TextAppearance.Medium">     <item name="android:textSize">28sp</item>     <item name="android:textColor">#000</item>     <item name="android:textStyle">bold</item> </style>  <style name="CollapsedAppBar" parent="@android:style/TextAppearance.Medium">     <item name="android:textSize">24sp</item>     <item name="android:textColor">@color/white</item>     <item name="android:textStyle">normal</item> </style>  <style name="ExpandedAppBarPlus1" parent="@android:style/TextAppearance.Medium">     <item name="android:textSize">28.5sp</item>     <item name="android:textColor">#000</item>     <item name="android:textStyle">bold</item> </style>  <style name="CollapsedAppBarPlus1" parent="@android:style/TextAppearance.Medium">     <item name="android:textSize">24.5sp</item>     <item name="android:textColor">@color/white</item>     <item name="android:textStyle">normal</item> </style> 
like image 112
doubleA Avatar answered Oct 09 '22 21:10

doubleA


Okay I have a workaround while we wait for Google:

  1. Grab the gist from https://gist.githubusercontent.com/blipinsk/3f8fb37209de6d3eea99/raw/b13bd20ebb319d94399f0e2a0bedbff4c044356a/ControllableAppBarLayout.java (I'm not the original creator but kudos to original author). This adds a few methods to the AppBarLayout, namely expand and collapse

  2. In your method that calls setTitle():

collapsingToolbar.setTitle("All Recent"); getSupportActionBar().setTitle("All Recent"); collapseThenExpand(); 
  1. Now create a collapseThenExpand() method:

private void collapseThenExpand() {   appbar.collapseToolbar();    Handler h = new Handler();   h.postDelayed(new Runnable() {     @Override     public void run() {       appbar.expandToolbar(true);     }   }, 800); } 

Note you can turn off the expand animation by setting it to false.

like image 36
Tommy Chan Avatar answered Oct 09 '22 21:10

Tommy Chan