Mit der neuen Design Library sollten wir den Symbolleistentitel auf CollapsingToolbarLayout
und nicht auf Toolbar
selbst setzen (zumindest bei Verwendung der minimierenden Symbolleiste). setTitle()
aktualisiert den Titel jedoch nur unter folgenden Umständen:
1) Wenn CollapsingToolbarLayout
noch keinen Titel hat
2) Im Moment ist CollapsingToolbarLayout
vollständig zusammengebrochen
3) In dem Moment beginnt die CollapsingToolbarLayout
zu expandieren
Was ich eigentlich zu tun versuche, ist, den Titel zu einem EditText
zu machen, wenn er vollständig erweitert ist, so dass der Benutzer seinem Charakter einen Namen geben kann, der dann als Titel angezeigt wird. Ich habe versucht, das Problem zu erzwingen, indem ich invalidate()
oder requestLayout()
sowie beide dieser Methoden für CollapsingToolbarLayout
s Kinder aufrufe. Keine Wirkung.
Irgendwelche Ideen?
BEARBEITEN: Diese Lösung wird nicht mehr benötigt. Fehler behoben in v22.2.1
Ich wollte nicht einfach Links verlassen, also hier ist die vollständige Lösung.
Der Fehler tritt auf, weil der Code zum Verarbeiten des ausblendbaren Titels nur den tatsächlichen Titel aktualisiert, wenn der aktuelle Titel Null ist oder sich die Textgröße geändert hat. Die Problemumgehung besteht darin, die Textgröße des Titels zu ändern und dann wieder zu ändern. Ich benutzte 0.5 SP, so dass es keinen großen Sprung gab. Wenn Sie die Textgröße ändern, wird der Text aktualisiert, und es erfolgt kein Flimmern. nur eine geringfügige Änderung der Textgröße.
Das ist was ich habe
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);
}
in styles.xml habe ich
<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>
Glückliche Kodierung.
Okay, ich habe eine Problemumgehung, während wir auf Google warten:
Grab the Gist aus https://Gistubithusercontent.com/blipinsk/3f8fb37209de6d3eea99/raw/b13bd20ebb319d94399f0e2a0bedbff4c044356a/ControllableAppBarLayout.Java Dies fügt der AppBarLayout
einige Methoden hinzu, nämlich expandieren und reduzieren
In Ihrer Methode, die setTitle()
aufruft:
collapsingToolbar.setTitle("All Recent");
getSupportActionBar().setTitle("All Recent");
collapseThenExpand();
collapseThenExpand()
-Methode:private void collapseThenExpand() {
appbar.collapseToolbar();
Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
appbar.expandToolbar(true);
}
}, 800);
}
Hinweis: Sie können die Erweiterungsanimation deaktivieren, indem Sie sie auf "false" setzen.
In meiner Lösung musste ich den Titel sowohl für die Symbolleiste als auch für die reduzierte Symbolleiste festlegen, damit sie funktioniert.
Also in OnCreate:
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
Und weiter unten, wenn ich Fragmente wechsle, stelle ich den Titel für beide ein, wenn eine Registerkarte ausgewählt wird:
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;
}
Hoffe das hilft jemandem!