CollapsingToolbarLayout setTitle()不会更新,除非折叠

使用新的devise库,我们应该在CollapsingToolbarLayout上设置工具栏标题,而不是Toolbar本身(至less在使用折叠工具栏时)。 但setTitle()只在以下特定情况下更新标题:

1)当CollapsingToolbarLayout还没有标题

2)目前CollapsingToolbarLayout完全折叠

3)目前CollapsingToolbarLayout开始展开

我实际上试图做的是使标题在完全展开时变成EditText ,允许用户给他/她的angular色一个名字,然后显示为标题。 我试图通过调用invalidate()requestLayout()以及CollapsingToolbarLayout的子CollapsingToolbarLayout上的这两个方法来强制执行该问题。 没有效果。

有任何想法吗?

编辑:这个解决scheme不再需要。 在v22.2.1中修正的错误

我不想只留下链接,所以这里是完整的解决scheme。

出现该错误的原因是,如果当前标题为空或文本大小已更改,处理可折叠标题的代码仅更新实际标题。 解决方法是更改​​标题文本大小,然后将其更改回来。 我用了0.5 sp,所以没有太多的跳跃。 更改文字大小会强制更新文字,并且不会有闪烁。 只是轻微的文字大小变化。

这是我的

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

在styles.xml中我有

 <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> 

快乐的编码。

好的,当我们等待Google时,我有一个解决方法:

  1. https://gist.githubusercontent.com/blipinsk/3f8fb37209de6d3eea99/raw/b13bd20ebb319d94399f0e2a0bedbff4c044356a/ControllableAppBarLayout.java抓住要点(我不是最初的创造者,但对原作者的荣誉)&#x3002; 这增加了几个方法到AppBarLayout ,即展开和折叠

  2. 在调用setTitle()方法中:

 collapsingToolbar.setTitle("All Recent"); getSupportActionBar().setTitle("All Recent"); collapseThenExpand(); 
  1. 现在创build一个collapseThenExpand()方法:
 private void collapseThenExpand() { appbar.collapseToolbar(); Handler h = new Handler(); h.postDelayed(new Runnable() { @Override public void run() { appbar.expandToolbar(true); } }, 800); } 

请注意,您可以通过将展开animation设置为false来closures展开animation。

在我的解决scheme中,我必须为工具栏和折叠工具栏设置标题。

所以在OnCreate中:

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

然后进一步下来,当我切换片段时,我设置标题为两个选项卡时:

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

希望帮助别人!