Tablayout + ViewPager2 + Fragment , Fragment 如何自适应高度
主要方法:
private void updatePagerHeightForChild(ViewPager2 pager) {
if (mFragmentList.size() > 0) {
View view = mFragmentList.get(pager.getCurrentItem()).getView();
if (view != null) {
view.post(() -> {
int wMeasureSpec = View.MeasureSpec.makeMeasureSpec(view.getWidth(), View.MeasureSpec.EXACTLY);
int hMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
view.measure(wMeasureSpec, hMeasureSpec);
if (pager.getLayoutParams().height != view.getMeasuredHeight()) {
ViewGroup.LayoutParams layoutParams = pager.getLayoutParams();
layoutParams.height = view.getMeasuredHeight();
pager.setLayoutParams(layoutParams);
}
});
}
}
}
在tablayout的监听里:
tablayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
updatePagerHeightForChild(vp);
vp.setCurrentItem(tab.getPosition());
String trim = tab.getText().toString().trim();
SpannableString spStr = new SpannableString(trim);
StyleSpan styleSpan_B = new StyleSpan(Typeface.BOLD);
spStr.setSpan(styleSpan_B, 0, trim.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
tab.setText(spStr);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
String trim = tab.getText().toString().trim();
SpannableString spStr = new SpannableString(trim);
StyleSpan styleSpan_B = new StyleSpan(Typeface.NORMAL);
spStr.setSpan(styleSpan_B, 0, trim.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
tab.setText(spStr);
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
这两行是重点:
updatePagerHeightForChild(vp);
vp.setCurrentItem(tab.getPosition());
而且代码顺序一定不能错
最后一步 , 在viewpager2的adapter设置完后:
BaseViewPager2Adapter adapter = new BaseViewPager2Adapter(this);
binding.tabVp.setAdapter(adapter);
binding.tabVp.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
updatePagerHeightForChild(binding.bankTypeA.tabVp);
}
});