wake-up-neo.net

CollapsingToolbarLayout setTitle () wird nur aktualisiert, wenn es reduziert ist

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 CollapsingToolbarLayouts Kinder aufrufe. Keine Wirkung. 

Irgendwelche Ideen?

25
Amagi82

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.

27
doubleA

Okay, ich habe eine Problemumgehung, während wir auf Google warten:

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

  2. In Ihrer Methode, die setTitle() aufruft:

collapsingToolbar.setTitle("All Recent");
getSupportActionBar().setTitle("All Recent");
collapseThenExpand();
  1. Erstellen Sie nun eine 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.

5
Tommy Chan

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!

0
Daveak