如图,tabLayout结合viewPager结合使用后,tabLayout不显示。
网上搜了下,说是setupWithViewPager的设置顺序导致的,这一点其实我也想到了,可顺序调整后底部tab还是不显示。
看了下预览视图,发现tablayout被viewpager挤出去了。what?viewpager不是设置成wrap_content吗,怎么效果是match_parent。
于是看了一下ViewPager的源码,定位到ViewPager的onMeasure中查看:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// For simple implementation, our internal size is always 0.
// We depend on the container to specify the layout size of
// our view. We can't really know what it is since we will be
// adding and removing different arbitrary views and do not
// want the layout to change as this happens.
setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),
getDefaultSize(0, heightMeasureSpec));
final int measuredWidth = getMeasuredWidth();
final int maxGutterSize = measuredWidth / 10;
mGutterSize = Math.min(maxGutterSize, mDefaultGutterSize);
...
}
从注释可以看到,viewPager默认的size都是0,然后优先用父布局传过来的宽高,其效果就是宽高没有指定的话就相当于match_parent,完全不考虑子view的属性,因为子view可以被动态的添加或删除,宽高可能是不确定的。
网上都说要重写onMeasure方法,其实不需要,有个简便方法,就是把wrap_content改成0dp,weight设置成1,这样就好了。不要问我是怎么想到的,灵感来了就是这么6。
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
>
</android.support.v4.view.ViewPager>
扫码关注我吧: