CollapsingToolbarLayout setTitle() не обновляется, если не свернут
В новой библиотеке дизайна мы должны установить заголовок панели инструментов на CollapsingToolbarLayout
, а не на Toolbar
(по крайней мере, при использовании панели свертывания). Но setTitle()
обновляет заголовок только в следующих особых случаях:
1) Когда CollapsingToolbarLayout
еще не имеет названия
2) В настоящий момент CollapsingToolbarLayout
становится полностью скомпенсированным
3) В настоящий момент CollapsingToolbarLayout
начинает расширяться
То, что я на самом деле пытаюсь сделать, - сделать заголовок EditText
полностью расширенным, позволяя пользователю присвоить своему персонажу имя, которое затем будет отображаться как заголовок. Я пытался заставить проблему, позвонив
invalidate()
или requestLayout()
, а также оба этих метода для детей CollapsingToolbarLayout
. Нет эффекта.
Любые идеи?
Ответы
Ответ 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();
- Теперь создайте метод
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;
}
Надеюсь, что это поможет кому-то!