ObservableScrollView中的自定义ViewPager无法正确测量高度

时间:2015-03-15 07:43:08

标签: android android-fragments android-viewpager scrollview

我在CustomViewPager内有ObservableScrollView,如下所示:

enter image description here

似乎测量片段但不测量离开屏幕的片段的高度。所以我实际上无法向上滚动。

这是CustomViewPager的代码:

public class CustomViewPager extends ViewPager {

private View view;

public CustomViewPager(Context context) {
    super(context);
}

public CustomViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    boolean wrapHeight = MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST;

    View tab = getChildAt(getCurrentItem());
    int width = getMeasuredWidth();
    int tabHeight = tab.getMeasuredHeight();

    if (wrapHeight) {
        // Keep the current measured width.
        widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
    }

    int fragmentHeight = measureFragment(((Fragment) getAdapter().instantiateItem(this, getCurrentItem())).getView());
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(tabHeight + fragmentHeight + (int)
            TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics()), MeasureSpec.AT_MOST);

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

public int measureFragment(View view) {
    if (view == null)
        return 0;

    view.measure(0, 0);
    return view.getMeasuredHeight();
}

}

注意:如果我在+ 1000中向heightMeasureSpec添加说super.onMeasure(widthMeasureSpec, heightMeasureSpec);,那么我可以滚动片段的大小以及任何额外的空格。但显然这不是一个首选的解决方案。

这是我的XML文件:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">


<LinearLayout
    android:id="@+id/infoBox"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="240dp">

    <!-- Code for other views -->

</LinearLayout>

<com.github.ksoichiro.android.observablescrollview.ObservableScrollView
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:scrollbars="none">

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

        <com.ui.customviewpager.CustomViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />


    </LinearLayout>

</com.github.ksoichiro.android.observablescrollview.ObservableScrollView>

这里似乎有什么问题?看来我不是唯一有这个问题的人。

我通过此链接here

实施了一些此设计

3 个答案:

答案 0 :(得分:4)

ScrollView子节点不应该有scrollView正确显示的余量。 当scrollView测量其子节点时,似乎没有考虑边距。

尝试删除LinearLayout的边距(您可以使用填充来重现效果)。

答案 1 :(得分:4)

为什么不在片段中使用ObservableScrollView并将viewpager放在TouchInterceptionFrameLayout(来自同一个lib)中,然后将ObservableScrollView的setTouchInterceptionViewGroup设置为包含viewpager的那个,并将活动中的TouchInterceptionListener上的逻辑设置为使用动画上下移动它以模仿平滑的滚动效果。

我希望那就是你正在寻求实现,并希望它会对你有所帮助。

Ps:看看那个人的示例应用和来源(Link),它有点复杂,但我相信你会找到一些东西。

答案 2 :(得分:1)

您好我不太了解ObservableScrollView,但根据您的问题,您无法找到片段的高度。经过大量搜索后,我能够找到教程来获得碎片的高度。

这是链接 http://adanware.blogspot.in/2012/06/android-getting-measuring-fragment.html

希望,这会对你有帮助。