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.

Есть ли обходной путь или нам нужно дождаться его исправления в библиотеке? Прямо сейчас, это, кажется, showstopper для любого приложения, нуждающегося в этой функции.

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; 
} 

Вы, возможно, потребуется для уменьшения высоты строки состояния, если вы используете . «Android: fitsSystemWindows =» истинный»

Там Надеюсь, что это помогает некоторые классы, которые вам нужно. копия из библиотеки дизайн, чтобы весь импорт & некоторые методы, которые превратят общественность.

Приветствия.

+0

Clever. Это, вероятно, работает, но я до сих пор не удалось сделать все зависимые файлы работают. :-) Но можете ли вы опубликовать его в очереди на выпуск Android? Chris Banes может приветствовать его и включить в следующий выпуск ... –

+0

Придется исправить код AppBarLayout и CollapsingToolbarLayout, чтобы заставить его работать должным образом из-за зависимостей классов. Слишком много работы по такой проблеме. Надеюсь, они исправит это в ближайшее время. – TalMihr

+0

Я не уверен, что они будут, если вы не сообщите о проблеме и не предложите решение. :-) –