android 设置view高度自适应,Android ViewPager 高度自适应

ViewPager 是开发中经常用到的一个控件,但高度却不能根据内容自适应,设置android:layout_height="wrap_content"之后还是占满全屏。看的网上的解决办法主要有下面几种:

设置固定高度 android:layout_height="100dp"。在一定情况下这种方法是可以的,但在屏幕适配方面可能会有问题。

在LinearLayout布局中使用weight改变ViewPager的高度。

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/viewpager"

android:layout_width="match_parent"

android:layout_weight="1"

android:layout_height="0dp" />

android:id="@+id/textView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="123456" />

这种方法也可以调整ViewPager的高度,但其高度取决于其他控件,在一些情况下无法满足需求。

动态计算高度,通过LayoutParmas改变ViewPager的高度,或者在onMeasure中返回childView的高度。网上大部分的解决方法是通过下面的方法。

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int height = 0;

//下面遍历所有child的高度

for (int i = 0; i < getChildCount(); i++) {

View child = getChildAt(i);

child.measure(widthMeasureSpec,

MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

int h = child.getMeasuredHeight();

if (h > height) //采用最大的view的高度。

height = h;

}

heightMeasureSpec = MeasureSpec.makeMeasureSpec(height,

MeasureSpec.EXACTLY);

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

这种方式是通过计算ViewPager已经加载的页面中高度最大的值设置为ViewPager的高度,这种方法在ViewPager的每个页面的高度都相等的情况下是非常实用的,能很好的解决ViewPager高度自适应问题,但如果需求是ViewPager的每个页面的高度都不太一致,用这种方式就会有些问题,从页面高度大的滑动到页面高度小的时,ViewPager的高度会不变,不能做到实时根据内容的大小进行调整。

我对上面的方法进行了一些调整,能做到ViewPager的高度实时。

public class ContentViewPager extends ViewPager {

public ContentViewPager(Context context) {

super(context);

}

public ContentViewPager(Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int index = getCurrentItem();

int height = 0;

View v = ((Fragment) getAdapter().instantiateItem(this, index)).getView();

if (v != null) {

v.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

height = v.getMeasuredHeight();

}

heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

}

通过实时获取ViewPager当前显示页面的高度来调整ViewPager的高度,通过这种方式可是实现ViewPager的高度实时根据页面的内容来调整,但这种方式也有点问题,就是在ViewPager切换时能明显看到页面高度的变化,暂时没找到好的方式来解决这个问题。

欢迎大家使用,如果有更好的方式也希望能分享出来。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值