gpt4 book ai didi

android - 在 Scrollview 中使用 FragmentStatePagerAdapter、Viewpager 的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:09:38 26 4
gpt4 key购买 nike

我正在使用:

  • 包含以编程方式添加的 fragmentactivity 布局。
  • 父 fragment 有 FragmentStatePagerAdapter 和 View 分页器,所有内容都在 ScrollView 中。
  • View pager 充满了一些具有 Recyclerview 的子 fragment 。

问题是:

  • View pager fragment 有一个列表,所以我必须以编程方式设置父 View pager 高度。但我不能那样做。

为此,我使用了

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

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

此外,我已经尝试将 view pager 和 view pager fragments height 属性设置为 wrap_content

  • 如果我不使用 android:fillViewport="true" 设置 scrollview android:layout_height="match_parent",就看不到 View 寻呼机内容。

父 fragment 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>

最佳答案

您可以自定义 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 中可能有数百行。对 ListView 使用 wrap_content 不是个好主意。您需要为 ListView 提供固定高度,或者您需要使用 match_parent

关于android - 在 Scrollview 中使用 FragmentStatePagerAdapter、Viewpager 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46390700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com