【问题标题】:Problems using FragmentStatePagerAdapter, Viewpager inside Scrollview在 Scrollview 中使用 FragmentStatePagerAdapter、Viewpager 的问题
【发布时间】:2017-09-24 13:43:54
【问题描述】:

我正在使用:

  • 以编程方式添加的包含fragment 的activity 布局。
  • 父片段有FragmentStatePagerAdapter 和视图寻呼机,所有内容都在ScrollView 内。
  • View pager 中充满了一些具有 Recyclerview 的子片段。

问题是:

  • 视图分页器片段有一个列表,因此我必须以编程方式设置父视图分页器高度。但我做不到。

为此,我使用了

viewpager.getLayoutParams().height = 20000;
viewpager.requestLayout();`

和

ViewGroup.LayoutParams params = viewPagerBottom.getLayoutParams();
params.height =  20000;
viewPagerBottom.setLayoutParams(params);

另外,我尝试了查看寻呼机和查看寻呼机片段高度属性为wrap_content

  • 如果我没有将滚动视图 android:layout_height="match_parent" 设置为 android:fillViewport="true",则无法查看视图寻呼机内容。

它是父片段layout.xml。

<ScrollView
    style="@style/scrollDefaultStyle"
    android:layout_height="wrap_content"
    android:fillViewport="true"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TabLayout .... />

        <android.support.v4.view.ViewPager
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

    </LinearLayout>
</ScrollView>

【问题讨论】:

    标签: android android-fragments android-viewpager scrollview fragmentstatepageradapter


    【解决方案1】:

    您可以自定义ViewPager 以将ViewPager 的大小调整为从该answer 滑动页面时的当前页面大小。

    您可以使用以下代码:

     public class WrapContentViewPager extends ViewPager {
    
            private int mCurrentPagePosition = 0;
    
            public WrapContentViewPager(Context context) {
                super(context);
            }
    
            public WrapContentViewPager(Context context, AttributeSet attrs) {
                super(context, attrs);
            }
    
            @Override
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            try {
                 boolean wrapHeight = MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST;
                 if (wrapHeight) {
                     View child = getChildAt(mCurrentPagePosition);
                     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);
        }
    
            public void reMeasureCurrentPage(int position) {
                mCurrentPagePosition = position;
                requestLayout();
            }
        }
    

    在xml中声明:

        <your.package.name.WrapContentViewPager
                android:id="@+id/view_pager"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
        </your.package.name.WrapContentViewPager>
    

    在页面滑动时调用reMeasureCurrentpage函数。

        final WrapContentViewPager wrapContentViewPager = (WrapContentViewPager) findViewById(R.id.view_pager);
    
        wrapContentViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                    @Override
                    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
                    }
    
                    @Override
                    public void onPageSelected(int position) {
                        wrapContentViewPager.reMeasureCurrentPage(wrapContentViewPager.getCurrentItem());
                    }
    
                    @Override
                    public void onPageScrollStateChanged(int state) {
    
                    }
                });
    

    注意:ListView 中可能有数百行。将wrap_content 用于ListView 并不是一个好主意。您需要为ListView 提供固定高度,否则您需要使用match_parent。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多