Java 滚动视图中的Viewpager
我在Java 滚动视图中的Viewpager,java,android,eclipse,android-viewpager,adt,Java,Android,Eclipse,Android Viewpager,Adt,我在滚动视图中有一个ViewPager,以及其他组件。当我在XML中为ViewPager指定高度时,ScrollView正常工作,但我不能为ScrollView指定高度,因为ViewPager应该根据页面高度展开。我已经实现了一个runnable,它将在运行时扩展ViewPager 问题是我无法滚动外部的ScrollView,它保存着ViewPager XML======= <ScrollView android:layout_width="match_parent" android:la
滚动视图
中有一个ViewPager
,以及其他组件。当我在XML
中为ViewPager
指定高度时,ScrollView
正常工作,但我不能为ScrollView
指定高度,因为ViewPager
应该根据页面高度展开。我已经实现了一个runnable,它将在运行时扩展ViewPager
问题是我无法滚动外部的ScrollView
,它保存着ViewPager
XML=======
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:src="@drawable/img1"
android:scaleType="fitXY"
android:layout_width="match_parent"
android:layout_height="150dp"
android:id="@+id/img_1"
/>
<ViewPager
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ViewPager>
</ScrollView>
})) 我认为您必须删除java代码。但将以下属性添加到scrollview xml中:
android:fillViewport="true"
这里回答了这个问题:。
无论如何,我会给你解决这个问题所需要的代码:
public class CustomPager extends ViewPager {
private View mCurrentView;
public CustomPager(Context context) {
super(context);
}
public CustomPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mCurrentView == null) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
return;
}
int height = 0;
mCurrentView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = mCurrentView.getMeasuredHeight();
if (h > height) height = h;
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void measureCurrentView(View currentView) {
mCurrentView = currentView;
requestLayout();
}
public int measureFragment(View view) {
if (view == null)
return 0;
view.measure(0, 0);
return view.getMeasuredHeight();
}
}
正如所有者的回答所说:每次更改页面时,都需要重新测量ViewPager。最好的方法是设置PagerAdapter的PrimaryItem函数
公共类MyPagerAdapter扩展了FragmentPagerAdapter{
私有列表片段;
private int mCurrentPosition=-1;
公共MyPagerAdapter(碎片管理器fm){
超级(fm);
this.fragments=new ArrayList();
添加(新的FirstFragment());
添加(新的SecondFragment());
添加(新的ThirdFragment());
添加(新的第四个片段());
}
@凌驾
公共void setPrimaryItem(视图组容器、int位置、对象){
super.setPrimaryItem(容器、位置、对象);
如果(位置!=mCurrentPosition){
Fragment=(Fragment)对象;
CustomPager pager=(CustomPager)容器;
if(fragment!=null&&fragment.getView()!=null){
mCurrentPosition=位置;
measureCurrentView(fragment.getView());
}
}
}
@凌驾
公共片段getItem(int位置){
返回碎片。获取(位置);
}
@凌驾
public int getCount(){
返回fragments.size();
}
}
你可以找到所有的代码我找到了很好的解决方案
无论如何,这是文章中的代码:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
try {
int currentPagePosition=0;
View child = getChildAt(currentPagePosition);
if (child != null) {
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
}
} catch (Exception e) {
e.printStackTrace();
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
你需要创建你自己的自定义视图页面,从ViewPager扩展并覆盖onMeasure方法请向我们提供你的代码来帮助你找到方法了吗?nvm我找到了,请看,在这篇文章中显示我的答案:我猜ViewPager内容是在运行时定义的或下载的,所以他不能使用fillViewport。
public class MyPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
private int mCurrentPosition = -1;
public MyPagerAdapter(FragmentManager fm) {
super(fm);
this.fragments = new ArrayList<Fragment>();
fragments.add(new FirstFragment());
fragments.add(new SecondFragment());
fragments.add(new ThirdFragment());
fragments.add(new FourthFragment());
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
if (position != mCurrentPosition) {
Fragment fragment = (Fragment) object;
CustomPager pager = (CustomPager) container;
if (fragment != null && fragment.getView() != null) {
mCurrentPosition = position;
pager.measureCurrentView(fragment.getView());
}
}
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
try {
int currentPagePosition=0;
View child = getChildAt(currentPagePosition);
if (child != null) {
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
}
} catch (Exception e) {
e.printStackTrace();
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}