5

添加enterAlways到Cheesesquare演示的滾動標誌:Cheesesquare:enterAlways產生錯誤的佈局

<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"> 

導致錯誤的佈局:

enter image description here

在向下滾動,標題進來正確,但不會停在正確的位置。滾動進一步取代了部件:背景圖像出現在錯誤的位置,由於背景顏色的變化,工具欄變得不可見。 (我還在這裏爲工具欄增加了一個colorPrimary背景,使其更加明顯,但問題並不取決於顏色)。這些庫是今天最新的23.1.0。

是否有任何解決方法,或者我們必須等待它在庫中得到修復?現在,它似乎是任何需要此功能的應用程序的炫目者。

enterAlwaysCollapsed的作品,但提供了不同的功能,這不是一種解決方法。

回答

2

我解決了這個問題,修補了一些AppBarLayout類的源代碼。顯然他們並不認爲人們會這樣使用它。或者他們做了,我走了。反正它適用於我。

您需要對此方法稍作更改。尋找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; 
} 

您可能需要遞減狀態欄的高度,如果你正在使用 。「機器人:fitsSystemWindows =」真」

希望它可以幫助有一個一些類,你將需要。從設計庫複製到允許所有進口&一些方法會變成公衆。

乾杯。

+0

聰明的。它可能工作,但我還沒有設法讓所有的相關文件。 :-)但是,你可以將它發佈在Android問題隊列中嗎?克里斯巴恩斯可能會歡迎它,並將其包含在下一個版本中... –

+0

必須修復AppBarLayout代碼和CollapsingToolbarLayout,才能使其正常工作,這是因爲類依賴關係。爲這樣的問題做了太多的工作。希望他們儘快修復。 – TalMihr

+0

我不確定他們會如何,除非您發現問題並在那裏提供解決方案。 :-) –