web-dev-qa-db-fra.com

CollapsingToolbarLayout setTitle () ne met pas à jour à moins que réduit

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?

25
Amagi82

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.

27
doubleA

D'accord, j'ai une solution de rechange pendant que nous attendons Google:

  1. 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

  2. Dans votre méthode qui appelle setTitle():

collapsingToolbar.setTitle("All Recent");
getSupportActionBar().setTitle("All Recent");
collapseThenExpand();
  1. Maintenant, créez une méthode 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.

5
Tommy Chan

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!

0
Daveak