CollapsingToolbarLayout setTitle() does not update unless collapsed

22,279

Solution 1

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>

Solution 2

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.

Share:
22,279

Related videos on Youtube

Jim Pekarek
Author by

Jim Pekarek

Senior Software Engineer at Brilliant.org

Updated on November 11, 2021

Comments

  • Jim Pekarek
    Jim Pekarek over 2 years

    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.

  • Jim Pekarek
    Jim Pekarek almost 9 years
    For anyone using this, it does work in forcing a refresh of the title, but this: collapsingToolbarLayout.setTitle("new title"); appbar.collapseToolbar(false); appbar.expandToolbar(false); does NOT work. There needs to be some time between collapsing an expanding- even a delay of 1ms works. Unfortunately this causes a flicker.
  • Marcel
    Marcel almost 9 years
    The @doubleA solution is dirty but more effective, no flicker and easy to do. I'm using it.
  • Marcel
    Marcel almost 9 years
    No need for this workaround anymore. It´s fixed in v22.2.1 Please @doubleA update the answer
  • Neon Warge
    Neon Warge about 8 years
    I am using v23.0.1 and title is not showing up when I put the toolbar inside the CollapsingToolbarLayout
  • doubleA
    doubleA about 8 years
    @NeonWarge Your issue sounds like a different problem. You should start a new question and try to get help from there. My solution works for those using pre v22.2.1 If you are using v23.0.1 then this particular issue does not affect you. Good luck and Happy Coding.
  • Neon Warge
    Neon Warge about 8 years
    Yeah it works now, I stayed at build version 23.0.1 and use support library 23.1.1.
  • Peterdk
    Peterdk over 7 years
    Just using mCollapsingToolbarLayout.setTitle() fixed it for me, when using all toolbar.setTitle() methods did not update a set title.
  • doubleA
    doubleA over 7 years
    @Peterdk if you are using v22.2.1 or above then this should not be an issue as it has been fixed. Glad it works. Happy Coding. :)
  • Neon Warge
    Neon Warge over 7 years
    I am experiencing this problem in v24.0.2
  • doubleA
    doubleA over 7 years
    Yes it looks like the problem has regressed. According to @marioosh it is working in 24.1.1
  • anthony
    anthony over 7 years
    the problem stills in 24.2.1
  • doubleA
    doubleA over 7 years
    Yes many people have reported that this problem has been popping up again. @anthony i am interested to know if the fix still works? if not then it is not really the same problem even if it has the same symptoms.