CollapsingToolbarLayout setTitle() 不会更新,除非折叠
CollapsingToolbarLayout setTitle() does not update unless collapsed
对于新的设计库,我们应该在 CollapsingToolbarLayout
上设置工具栏标题,而不是 Toolbar
本身(至少在使用折叠工具栏时)。但 setTitle()
仅在以下特定情况下更新标题:
当CollapsingToolbarLayout
还没有标题时
此时 CollapsingToolbarLayout
完全折叠
此时CollapsingToolbarLayout
开始展开
我实际上想做的是让标题在完全展开时变成 EditText
,允许用户给 his/her 字符一个名称,然后显示为标题。我试图通过打电话来强制解决这个问题
invalidate()
或 requestLayout()
,以及 CollapsingToolbarLayout
的 children 中的这两种方法。没有效果。
好的,在我们等待 Google:
的时候我有一个解决方法
从 https://gist.githubusercontent.com/blipinsk/3f8fb37209de6d3eea99/raw/b13bd20ebb319d94399f0e2a0bedbff4c044356a/ControllableAppBarLayout.java 中获取要点(我不是原作者,但对原作者表示敬意)。这为 AppBarLayout
添加了一些方法,即 expand 和 collapse
在调用 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 来关闭展开动画。
编辑:不再需要此解决方案。 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>
在我的解决方案中,我必须为工具栏和折叠工具栏设置标题才能正常工作。
所以在 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
上设置工具栏标题,而不是 Toolbar
本身(至少在使用折叠工具栏时)。但 setTitle()
仅在以下特定情况下更新标题:
当
CollapsingToolbarLayout
还没有标题时此时
CollapsingToolbarLayout
完全折叠此时
CollapsingToolbarLayout
开始展开
我实际上想做的是让标题在完全展开时变成 EditText
,允许用户给 his/her 字符一个名称,然后显示为标题。我试图通过打电话来强制解决这个问题
invalidate()
或 requestLayout()
,以及 CollapsingToolbarLayout
的 children 中的这两种方法。没有效果。
好的,在我们等待 Google:
的时候我有一个解决方法从 https://gist.githubusercontent.com/blipinsk/3f8fb37209de6d3eea99/raw/b13bd20ebb319d94399f0e2a0bedbff4c044356a/ControllableAppBarLayout.java 中获取要点(我不是原作者,但对原作者表示敬意)。这为
AppBarLayout
添加了一些方法,即 expand 和 collapse在调用
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 来关闭展开动画。
编辑:不再需要此解决方案。 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>
在我的解决方案中,我必须为工具栏和折叠工具栏设置标题才能正常工作。
所以在 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;
}