Avec la nouvelle bibliothèque de conception, nous sommes supposés définir le titre de la barre d'outils sur la variable CollapsingToolbarLayout
, et non la variable Toolbar
elle-même (du moins lorsque vous utilisez la barre d'outils réduite). Mais setTitle()
met à jour le titre uniquement dans les cas spécifiques suivants:
1) Quand la CollapsingToolbarLayout
n'a pas encore de titre
2) Au moment où la CollapsingToolbarLayout
devient complètement effondrée
3) Au moment où la CollapsingToolbarLayout
commence à se développer
Ce que j'essaie en réalité de faire, c'est que le titre devienne une EditText
une fois complètement développé, permettant ainsi à l'utilisateur de donner un nom à son personnage, qui s'affiche ensuite comme titre. J'ai essayé de forcer le problème en appelant invalidate()
ou requestLayout()
, ainsi que ces deux méthodes sur les enfants de CollapsingToolbarLayout
. Aucun effet.
Des idées?
EDIT: Cette solution n'est plus nécessaire. bug corrigé dans v22.2.1
Je ne voulais pas simplement laisser des liens alors voici la solution complète.
Le bogue survient car le code permettant de gérer le titre compressible ne met à jour le titre réel que si le titre actuel est null ou si la taille du texte a été modifiée. La solution de contournement consiste à modifier la taille du texte du titre, puis à le rétablir. J'ai utilisé 0,5 sp alors il n'y avait pas trop d'un saut. Changer la taille du texte force le texte à être mis à jour et il n'y a pas de scintillement. juste un léger changement de taille de texte.
C'est ce que j'ai
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);
}
dans styles.xml j'ai
<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>
Bonne codage.
D'accord, j'ai une solution de rechange pendant que nous attendons Google:
Récupérez l'essentiel à partir de https://Gist.githubusercontent.com/blipinsk/3f8fb37209de6d3eea99/raw/b13bd20ebb319d94399f0e2a0bedbff4c044356a/ControllableAppBarLayout.Java Cela ajoute quelques méthodes à la AppBarLayout
, à savoir expand et collapse
Dans votre méthode qui appelle 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);
}
Notez que vous pouvez désactiver l'animation de développement en la définissant sur false.
Dans ma solution, je devais définir le titre de la barre d'outils et de la barre d'outils réductrice pour que celle-ci fonctionne.
Donc dans OnCreate:
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
Et puis plus bas quand je change de fragment, je donne le titre à la fois quand un onglet est sélectionné:
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;
}
J'espère que ça aide quelqu'un!