我在CustomViewPager
内有ObservableScrollView
,如下所示:
似乎测量片段但不测量离开屏幕的片段的高度。所以我实际上无法向上滚动。
这是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
实施了一些此设计答案 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
希望,这会对你有帮助。