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

Posted

技术标签:

【中文标题】CollapsingToolbarLayout setTitle() 不会更新,除非折叠【英文标题】:CollapsingToolbarLayout setTitle() does not update unless collapsed 【发布时间】:2015-08-21 08:23:23 【问题描述】:

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

    CollapsingToolbarLayout还没有标题时

    此时CollapsingToolbarLayout 完全折叠

    此时CollapsingToolbarLayout 开始扩展

我真正想做的是让标题在完全展开后变成EditText,允许用户给他/她的角色一个名字,然后显示为标题。我试图通过打电话来强迫这个问题 invalidate()requestLayout(),以及CollapsingToolbarLayout 的孩子的这两种方法。没有效果。

【问题讨论】:

我将此报告为一个错误,同时不知道如何强制它code.google.com/p/android/issues/… @RuAware 优秀。谢谢! Chris Banes 将此错误标记为 FutureRelease:code.google.com/p/android/issues/detail?id=175808 【参考方案1】:

编辑:不再需要此解决方案。修复了v22.2.1中的错误

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

出现该错误是因为处理可折叠标题的代码仅在当前标题为空或文本大小已更改时才更新实际标题。解决方法是更改​​标题文本大小,然后将其更改回来。我使用了 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>

【讨论】:

不再需要这种解决方法。它已在 v22.2.1 中修复,请@doubleA 更新答案 我使用的是 v23.0.1,当我将工具栏放在 CollapsingToolbarLayout 中时,标题没有显示 @NeonWarge 您的问题听起来像是另一个问题。您应该开始一个新问题并尝试从那里获得帮助。我的解决方案适用于使用 v22.2.1 之前的用户如果您使用的是 v23.0.1,那么这个特定问题不会影响您。祝你好运,编码愉快。 是的,它现在可以工作了,我停留在构建版本 23.0.1 并使用支持库 23.1.1。 仅使用 mCollapsingToolbarLayout.setTitle() 为我修复了它,当使用所有 toolbar.setTitle() 方法时没有更新集合标题。【参考方案2】:

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

    从https://gist.githubusercontent.com/blipinsk/3f8fb37209de6d3eea99/raw/b13bd20ebb319d94399f0e2a0bedbff4c044356a/ControllableAppBarLayout.java 获取要点(我不是原作者,但对原作者表示敬意)。这给AppBarLayout增加了几个方法,即展开和折叠

    在你调用setTitle()的方法中:

collapsingToolbar.setTitle("All Recent");
getSupportActionBar().setTitle("All Recent");
collapseThenExpand();
    现在创建一个collapseThenExpand() 方法:

private void collapseThenExpand() 
  appbar.collapseToolbar();

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

请注意,您可以通过将展开动画设置为 false 来关闭它。

【讨论】:

对于任何使用它的人,它确实可以强制刷新标题,但是:collapsingToolbarLayout.setTitle("new title");appbar.collapseToolbar(false);appbar.expandToolbar(false); 不起作用。在折叠展开之间需要一些时间——即使是 1ms 的延迟也可以。不幸的是,这会导致闪烁。 @doubleA 解决方案很脏但更有效,无闪烁且易于操作。我正在使用它。【参考方案3】:

在我的解决方案中,我必须设置工具栏和折叠工具栏的标题才能使其正常工作。

所以在 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;
                

【讨论】:

以上是关于CollapsingToolbarLayout setTitle() 不会更新,除非折叠的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 CollapsingToolbarLayout 字体和大小?

以编程方式折叠或展开 CollapsingToolbarLayout

Android:CollapsingToolbarLayout 和 SwipeRefreshLayout 卡住

CollapsingToolbarLayout 无法识别滚动投掷

检测 AppBarLayout/CollapsingToolbarLayout 何时完全展开

设置 CollapsingToolbarLayout 的起始高度