转-[Android实例] ScrollView内嵌ViewPager内容显示不全

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&tn=baiduhome_pg&wd=scrollview%20viewpager&rsv_spt=1&rsv_pq=8168e5fb000b0687&rsv_t=2c5czLzatLV26PoDNX56Q7Zx%2BDjYyVvLye%2BAH697NXGLzExuPYD%2BqqHo62bGPag2H5PH&rsv_enter=1&rsv_sug3=39&rsv_sug1=1&bs=android%20eclipse%20id%E9%87%8D%E5%A4%8D

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=539456

[Android实例] ScrollView内嵌ViewPager内容显示不全 

[复制链接]

签到天数: 2 天

连续签到: 1 天

[LV.1]初来乍到

4

主题

248

帖子

1037

e币

跳转到指定楼层

楼主

 发表于 2014-8-5 11:04:07 | 只看该作者 回帖奖励
100e币
Scrollview里面内嵌了一个ViewPager,ViewPager的内容是4个Fragment,4个Fragment里面都有较多的内容,且4个Fragment的高度不一,因为Scrollview和ViewPager冲突导致内容显示不全的问题,我采用了以下两个办法解决:
方法一:
根据Fragment的高度动态设置ViewPager的高度,获取Fragment的高度的方法是,获取Fragment最外层layout的高度,
int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
ln_container.measure(w, h);
vp_contentHeight = ln_container.getMeasuredHeight();

设置Viewpager的高度,
LayoutParams layoutParams = (LinearLayout.LayoutParams)viewpager.getLayoutParams();
layoutParams.height = vp_contentHeight ;
viewpager.setLayoutParams(layoutParams);
但是这个方法,虽然能动态设置高度,但是不准确,viewpager的内容还是有一小部分显示不全。
方法二:
重写Viewpager的OnMeasure函数,
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub@xjxuvup @37X21=777 @haoliuyou@fortianwei @Pis @hehui1860 @hehui1860 @zjw681691 @zjw681691 @haoliuyou 
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}

但是这样做导致Scrollview不能滑动了。
我已经黔驴技穷了,请大神们给支支招。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

收藏收藏 分享分享 分享淘帖 好评好评 差评差评

签到天数: 2 天

连续签到: 1 天

[LV.1]初来乍到

4

主题

248

帖子

1037

e币

沙发

  楼主| 发表于 2014-8-5 11:05:57 | 只看该作者
自己先顶一顶  顶 顶顶 顶 顶 顶 顶

该用户从未签到

4

主题

90

帖子

822

e币

板凳

 发表于 2014-8-5 12:47:46 | 只看该作者
为什么非要在Scrollview里面内嵌了一个ViewPager,你把两者反过来嵌套不就好好的了

签到天数: 14 天

连续签到: 1 天

[LV.3]偶尔看看II

16

主题

695

帖子

4887

e币

地板

 发表于 2014-8-5 14:01:40 | 只看该作者
显示不全,图片么?还是一个布局?

点评

Fragment里面的布局  详情 回复 发表于 2014-8-5 14:21

签到天数: 2 天

连续签到: 1 天

[LV.1]初来乍到

4

主题

248

帖子

1037

e币

5

  楼主| 发表于 2014-8-5 14:21:43 | 只看该作者

JAE_Smart 发表于 2014-8-5 14:01
显示不全,图片么?还是一个布局?

Fragment里面的布局

点评

确实如楼上多说,你可以反过来嵌套  详情 回复 发表于 2014-8-5 14:24

签到天数: 14 天

连续签到: 1 天

[LV.3]偶尔看看II

16

主题

695

帖子

4887

e币

6

 发表于 2014-8-5 14:24:34 | 只看该作者

jiaguojiang 发表于 2014-8-5 14:21
Fragment里面的布局

确实如楼上多说,你可以反过来嵌套

签到天数: 2 天

连续签到: 1 天

[LV.1]初来乍到

4

主题

248

帖子

1037

e币

7

  楼主| 发表于 2014-8-5 17:37:38 | 只看该作者
已经解决了,解决办法如下:
重写viewpager的OnMeasure方法:
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
int viewHeight = 0;
View childView = getChildAt(getCurrentItem());
childView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
viewHeight = childView.getMeasuredHeight();
heightMeasureSpec = MeasureSpec.makeMeasureSpec(viewHeight, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

签到天数: 2 天

连续签到: 1 天

[LV.1]初来乍到

4

主题

248

帖子

1037

e币

8

  楼主| 发表于 2014-8-5 17:40:31 | 只看该作者
已经解决了,解决办法如下:
重写viewpager的OnMeasure方法:
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
int viewHeight = 0;
View childView = getChildAt(getCurrentItem());
childView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0,      MeasureSpec.UNSPECIFIED));
viewHeight = childView.getMeasuredHeight();
heightMeasureSpec = MeasureSpec.makeMeasureSpec(viewHeight, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
给viewpager设置OnPageChangeListener:
vp_details.setOnPageChangeListener(new OnPageChangeListener() {
 
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub

。。。。
View view = vp_details.getChildAt(currentSelectedPosition);
int height = view.getMeasuredHeight();
LayoutParams layoutParams = (LinearLayout.LayoutParams)vp_details.getLayoutParams();
layoutParams.height = height;
vp_details.setLayoutParams(layoutParams);

该用户从未签到

1

主题

65

帖子

9

e币

QQ认证社区认证会员
9

 发表于 2014-8-5 19:23:53 | 只看该作者
其实他们是容易冲突的,需要设定一下被嵌套的布局的高度

签到天数: 14 天

连续签到: 1 天

[LV.3]偶尔看看II

0

主题

25

帖子

116

e币

10

 发表于 2014-11-3 10:08:50 | 只看该作者
用你的方法报空指针,里面currentSelecredPosition 不知道你指什么,我是自定义viewpager childView报空,不知道怎么弄求大神教

该用户从未签到

0

主题

8

帖子

46

e币

11

 发表于 2014-11-16 12:09:21 | 只看该作者
我也遇上了这个问题,楼主您解决了吗

该用户从未签到

0

主题

1

帖子

18

e币

12

 发表于 2014-12-4 11:00:20 | 只看该作者
楼主的方法报空指针,我在onMeasure方法里面View childView = getChildAt(getCurrentItem())下面用的时候加个判断是否为空就行了。

该用户从未签到

0

主题

8

帖子

24

e币

13

 发表于 2015-4-1 11:09:33 | 只看该作者
我加载接口解析的数据时,因为解析数据需要一定时间,viewpager获取的高度是解析完成前内容的高度,怎么能在数据解析完成后,再给viewpager设置高度?