5

enterAlways auf die Scroll-Flaggen der Demo Cheesesquare Hinzufügen:Cheesesquare: enterAlways produziert falsches Layout

<android.support.design.widget.CollapsingToolbarLayout 
    android:id="@+id/collapsing_toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    app:contentScrim="?attr/colorPrimary" 
    app:layout_scrollFlags="scroll|exitUntilCollapsed|enterAlways"> 

führen zu einem falschen Layout:

enter image description here

Während Scrollen nach unten, der Kopf kommt in richtig, aber es hört nicht in der richtigen Position auf. Beim Scrollen werden die Teile weiter verschoben: Das Hintergrundbild erscheint an der falschen Stelle und die Werkzeugleiste wird aufgrund der Änderung der Hintergrundfarbe unsichtbar. (Ich habe auch einen colorPrimary Hintergrund zur Symbolleiste hinzugefügt, um es besser sichtbar zu machen, aber das Problem hängt natürlich nicht von der Farbe ab). Die Bibliotheken sind ab heute 23.1.0.

Gibt es eine Problemumgehung oder wir müssen warten, bis es in der Bibliothek behoben wird? Gerade jetzt scheint es ein Showstopper für jede App zu sein, die diese Funktionalität benötigt.

enterAlwaysCollapsed funktioniert, aber das gibt eine andere Funktionalität, es ist keine Problemumgehung.

Antwort

2

Ich löste dieses Problem mit ein wenig Patching für den Quellcode der AppBarLayout-Klasse. Anscheinend dachten sie nicht, dass die Leute es so benutzen würden. Oder sie taten es und ich bin weit weg. Wie auch immer, es funktioniert für mich.

Sie müssen eine kleine Änderung an dieser Methode vornehmen. sucht SCROLL_FLAG_EXIT_UNTIL_COLLAPSED

/** 
* Return the scroll range when scrolling down from a nested pre-scroll. 
*/ 
private int getDownNestedPreScrollRange() { 
    if (mDownPreScrollRange != INVALID_SCROLL_RANGE) { 
     // If we already have a valid value, return it 
     return mDownPreScrollRange; 
    } 

    int range = 0; 
    for (int i = getChildCount() - 1; i >= 0; i--) { 
     final View child = getChildAt(i); 
     final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 
     final int childHeight = child.getMeasuredHeight(); 
     final int flags = lp.mScrollFlags; 

     if ((flags & LayoutParams.FLAG_QUICK_RETURN) == LayoutParams.FLAG_QUICK_RETURN) { 
      // First take the margin into account 
      range += lp.topMargin + lp.bottomMargin; 
      // The view has the quick return flag combination... 
      if ((flags & LayoutParams.SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED) != 0) { 
       // If they're set to enter collapsed, use the minimum height 
       range += ViewCompat.getMinimumHeight(child); 
       // This is what is missing... 
      } else if ((flags & LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED) == LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED) { 
       range += childHeight - ViewCompat.getMinimumHeight(child); 
      } else { 
       // Else use the full height 
       range += childHeight; 
      } 
     } else if (range > 0) { 
      // If we've hit an non-quick return scrollable view, and we've already hit a 
      // quick return view, return now 
      break; 
     } 
    } 
    return mDownPreScrollRange = range; 
} 

Sie müssen möglicherweise die Statusleiste Höhe verringern, wenn Sie mit . „android: fitsSystemWindows =“ true“

Hoffe, es hilft es eine einige Klassen, die Sie benötigen. Kopie von der Design-Bibliothek alle Importe ermöglichen & einige Methoden, die Öffentlichkeit wenden.

Beifall.

+0

Clever. Es funktioniert wahrscheinlich, aber ich habe es noch nicht geschafft alle abhängigen Dateien arbeiten zu machen. :-) Aber könntest du es in der Android-Warteschlange veröffentlichen? Chris Banes könnte es willkommen heißen und es in die nächste Version einbinden ... –

+0

Hatte den AppBarLayout-Code und das CollapsingToolbarLayout korrigiert, damit es aufgrund von Klassenabhängigkeiten funktioniert. Zu viel Arbeit für ein solches Problem. Ich hoffe, sie reparieren es bald. – TalMihr

+0

Ich bin mir nicht sicher, ob sie das tun werden, es sei denn, Sie signalisieren das Problem und stellen die Lösung dort zur Verfügung. :-) –