26

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

  1. CollapsingToolbarLayout还没有标题时

  2. 此刻CollapsingToolbarLayout变得完全崩溃

  3. 此刻CollapsingToolbarLayout开始扩大

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

4

3 回答 3

27

编辑:不再需要此解决方案。在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>
于 2015-07-09T06:05:58.400 回答
5

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

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

  2. 在您调用的方法中setTitle()

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

private void collapseThenExpand() {
  appbar.collapseToolbar();

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

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

于 2015-06-25T00:41:37.013 回答
0

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

所以在 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;
                }
于 2016-11-26T12:49:31.180 回答