Подтвердить что ты не робот

CollapsingToolbarLayout setTitle() не обновляется, если не свернут

В новой библиотеке дизайна мы должны установить заголовок панели инструментов на CollapsingToolbarLayout, а не на Toolbar (по крайней мере, при использовании панели свертывания). Но setTitle() обновляет заголовок только в следующих особых случаях:

1) Когда CollapsingToolbarLayout еще не имеет названия

2) В настоящий момент CollapsingToolbarLayout становится полностью скомпенсированным

3) В настоящий момент CollapsingToolbarLayout начинает расширяться

То, что я на самом деле пытаюсь сделать, - сделать заголовок EditText полностью расширенным, позволяя пользователю присвоить своему персонажу имя, которое затем будет отображаться как заголовок. Я пытался заставить проблему, позвонив invalidate() или requestLayout(), а также оба этих метода для детей CollapsingToolbarLayout. Нет эффекта.

Любые идеи?

4b9b3361

Ответ 1

EDIT: это решение больше не требуется. исправлена ​​ошибка в v22.2.1

Я не хотел просто оставлять ссылки, поэтому вот полное решение.

Ошибка возникает из-за того, что код для обработки сбрасываемого заголовка обновляет фактический заголовок, если текущий заголовок равен null или размер текста изменился. Обходным путем является изменение размера текста заголовка, а затем его изменение. Я использовал 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>

Счастливое кодирование.

Ответ 2

Хорошо, у меня есть обходное решение, пока мы ждем Google:

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.

Ответ 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;
                }

Надеюсь, что это поможет кому-то!