Cheesesquare:enterAlways 产生错误的布局
Cheesesquare: enterAlways produces wrong layout
-
android
-
android-support-library
-
material-design
-
android-design-library
-
android-collapsingtoolbarlayout
将 enterAlways
添加到 Cheesesquare 演示的滚动标志:
<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">
导致布局错误:
在向下滚动过程中,header 正确进入但没有停在正确的位置。滚动会进一步置换部件:背景图像出现在错误的位置,并且由于背景颜色的变化,工具栏变得不可见。 (我还在此处的工具栏中添加了 colorPrimary
背景,以使其更显眼,但问题当然不取决于颜色)。这些库是截至今天的最新版本,23.1.0.
是否有任何解决方法,或者我们必须等待它在库中修复?现在,它似乎是任何需要此功能的应用程序的亮点。
enterAlwaysCollapsed
有效,但提供了不同的功能,这不是解决方法。
我通过修补 AppBarLayout class 源代码解决了这个问题。显然他们不认为人们会这样使用它。或者他们做到了,而我已经离开了。无论如何它对我有用。
您需要对此方法做一些小改动。寻找 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="真。
希望对您有所帮助。您需要从设计库中复制一些 classes 以允许所有导入和一些方法,这些方法将变成 public。
干杯。
android
android-support-library
material-design
android-design-library
android-collapsingtoolbarlayout
将 enterAlways
添加到 Cheesesquare 演示的滚动标志:
<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">
导致布局错误:
在向下滚动过程中,header 正确进入但没有停在正确的位置。滚动会进一步置换部件:背景图像出现在错误的位置,并且由于背景颜色的变化,工具栏变得不可见。 (我还在此处的工具栏中添加了 colorPrimary
背景,以使其更显眼,但问题当然不取决于颜色)。这些库是截至今天的最新版本,23.1.0.
是否有任何解决方法,或者我们必须等待它在库中修复?现在,它似乎是任何需要此功能的应用程序的亮点。
enterAlwaysCollapsed
有效,但提供了不同的功能,这不是解决方法。
我通过修补 AppBarLayout class 源代码解决了这个问题。显然他们不认为人们会这样使用它。或者他们做到了,而我已经离开了。无论如何它对我有用。
您需要对此方法做一些小改动。寻找 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="真。
希望对您有所帮助。您需要从设计库中复制一些 classes 以允许所有导入和一些方法,这些方法将变成 public。
干杯。