今天我在使用 CoordinatorLayout+AppBarLayout 时,出现一个奇葩的问题。头部布局用 appbarlayout 实现,下方主内容区域就一个 viewpager;但是 viewpager 中时滑动列表。问题来了,主内容列表区域的高度无法填充,总是多出一个 CollapsingToolbarLayout 的高度;经过问题分析定位,最终发现时外层AppBarLayut的问题。下方提出我的解决方式。
之前有文章写到AppBarLayout+TabLayout+ViewPager 时限头部布局滑动渐变的效果(链接) --->>https://blog.csdn.net/PenTablet/article/details/95459396
其中有提到过app:layout_behavior属性,来实现滑动效果。今天也是通过改变这个属性;
默认的属性是这样的, app:layout_behavior="@string/appbar_scrolling_view_behavior";我们要自定义一个behavior,来解决内容区域高度的问题。
FixScrollingFooterBehavior.java:
package com.koib.healthcontrol.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import com.google.android.material.appbar.AppBarLayout;
public class FixScrollingFooterBehavior extends AppBarLayout.ScrollingViewBehavior {
private AppBarLayout appBarLayout;
public FixScrollingFooterBehavior() {
super();
}
public FixScrollingFooterBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
if (appBarLayout == null) {
appBarLayout = (AppBarLayout) dependency;
}
final boolean result = super.onDependentViewChanged(parent, child, dependency);
final int bottomPadding = calculateBottomPadding(appBarLayout);
final boolean paddingChanged = bottomPadding != child.getPaddingBottom();
if (paddingChanged) {
child.setPadding(
child.getPaddingLeft(),
child.getPaddingTop(),
child.getPaddingRight(),
bottomPadding);
child.requestLayout();
}
return paddingChanged || result;
}
private int calculateBottomPadding(AppBarLayout dependency) {
final int totalScrollRange = dependency.getTotalScrollRange();
return totalScrollRange + dependency.getTop();
}
}
直接替换掉就好了。
我的问题时解决了,以此来记录。可能并使适合你们的布局,近作参考,勿喷,谢谢~~~