Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 滚动视图中的Viewpager_Java_Android_Eclipse_Android Viewpager_Adt - Fatal编程技术网

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);
    }