【问题标题】:Viewpager inside scrollview滚动视图内的 Viewpager
【发布时间】:2015-05-26 10:27:41
【问题描述】:

我有一个 ViewPagerScrollView 内以及其他组件。当我在XML 中为ViewPager 指定高度时,ScrollView 工作正常,但我无法为ScrollView 指定高度,因为ViewPager 应根据页面高度扩展。我已经实现了一个runnable,它将在运行时扩展ViewPager

问题是我无法滚动持有ViewPager 的外部ScrollView

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动态设置viewpager的高度

viewpager.post(new Runnable() {
@Override
public void run() {
    ViewGroup.LayoutParams lp = viewpager.getLayoutParams();
    lp.height = viewpager.getChildAt(viewpager.getCurrentItem()).getHeight();
    viewpager.setLayoutParams(lp);
}

});

【问题讨论】:

标签: java android eclipse android-viewpager adt


【解决方案1】:

这个问题在这里得到解答:Dynamic height viewpager

无论如何我都会给你解决它所需的代码:

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 的 setPrimaryItem 函数

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

你可以找到所有代码here

【讨论】:

    【解决方案2】:

    我找到了很好的解决方案here

    不管怎样,都是文章中的代码:

        @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 方法

    【讨论】:

      【解决方案3】:

      我认为您必须删除您的 java 代码。但将此属性添加到您的滚动视图 xml:

      android:fillViewport="true"
      

      【讨论】:

      • 我猜 viewPager 内容是在运行时定义或下载的,所以他不能使用 fillViewport。
      猜你喜欢
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      相关资源
      最近更新 更多