分为:
android.support.design.widget.CollapsingToolbarLayout; // 需反射 mLastInsets
com.google.android.material.appbar.CollapsingToolbarLayout; // 需反射 lastInsets
public class FixCollapsingToolbarLayout extends CollapsingToolbarLayout {
public FixCollapsingToolbarLayout(Context context) {
super(context);
}
public FixCollapsingToolbarLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FixCollapsingToolbarLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
try {
// android.support.design.widget.CollapsingToolbarLayout; // 需反射 mLastInsets
// com.google.android.material.appbar.CollapsingToolbarLayout; // 需反射 lastInsets
Field fs = CollapsingToolbarLayout.class..getDeclaredField("mLastInsets");
、、Field fs = this.getClass().getSuperclass().getDeclaredField("mLastInsets");
fs.setAccessible(true);
WindowInsetsCompat mLastInsets = (WindowInsetsCompat) fs.get(this);
final int mode = MeasureSpec.getMode(heightMeasureSpec);
int topInset = mLastInsets != null ? mLastInsets.getSystemWindowInsetTop() : 0;
if (mode == MeasureSpec.UNSPECIFIED && topInset > 0) {
// fix the bottom empty padding
heightMeasureSpec = MeasureSpec.makeMeasureSpec(
getMeasuredHeight() - topInset, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
} catch (Exception e) {
LogUtils.e(e);
}
}
}
或继承 android.support.design.widget.CollapsingToolbarLayout 时,使用如下:
public class FixCollapsingToolbarLayout extends CollapsingToolbarLayout {
private boolean mLayoutReady;
public FixCollapsingToolbarLayout(Context context) {
super(context);
}
public FixCollapsingToolbarLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FixCollapsingToolbarLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
if (!mLayoutReady) {
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
if ((getWindowSystemUiVisibility() &
(SYSTEM_UI_FLAG_LAYOUT_STABLE|SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)) ==
(SYSTEM_UI_FLAG_LAYOUT_STABLE|SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)) {
try {
Field mLastInsets = CollapsingToolbarLayout.class.getDeclaredField("mLastInsets");
mLastInsets.setAccessible(true);
mLastInsets.set(this, null);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
mLayoutReady = true;
}
super.onLayout(changed, left, top, right, bottom);
}
}
网友评论