使用 ViewPager 查看在 ScrollView 中不能垂直滚动
View with ViewPager not vertically scrollable in ScrollView
这感觉很简单,但不知何故我被困住了。该视图不允许我滚动它。就好像没有计算 ViewPager
中膨胀的片段的高度。搜索 SO 建议我需要编写自己的 ViewPager
并覆盖 onMeasure()
,但我不敢相信我会为了这么简单的事情而走那么远。
这是我的布局,为方便起见进行了一些简化。 ViewPager
填充了 space 超出屏幕(垂直)的片段。尽管如此,屏幕上的任何内容都不可滚动。这是为什么?
<ScrollView
android:id="@+id/scroll_view"
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:fillViewport="true">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/header_image_view"
android:layout_width="0dp"
android:layout_height="170dp"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/title_text_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/header_image_view"/>
<Button
android:id="@+id/resume_training_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/title_text_view"/>
<android.support.design.widget.TabLayout
android:id="@+id/lesson_table_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
app:layout_constraintTop_toBottomOf="@id/resume_training_button">
</android.support.design.widget.TabLayout>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/lesson_table_layout">
</android.support.v4.view.ViewPager>
</android.support.constraint.ConstraintLayout>
</ScrollView>
这是一个示例视图。 Lorem ipsum 文本会持续很长时间,我希望整个屏幕都可以滚动,但事实并非如此。
提前致谢!
有这样的问题,有时ScrollView
和ViewPager
切换焦点。如果你在 ScrollView
中有一个 ViewPager
并且你希望它在你触摸它时始终保持焦点并且 ScrollView
永远不会获得焦点,那么设置 requestDisallowInterceptTouchEvent
就可以了.
mViewPager= (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(adapter);
mViewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mViewPager.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
在此thread
中查找更多答案
编辑:
另一种我认为可能有效的方法是以编程方式设置滚动到您的 tablayout
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
尝试使用 nestedScrollView 而不是 scrollView.. 尝试以下代码片段..
<android.support.v4.widget.NestedScrollView 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"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@id/fragment_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="fill_vertical"
android:orientation="vertical">
...Content...
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/lesson_table_layout">
</android.support.v4.view.ViewPager>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
我最后重写了很多。根据
,在 TabLayout
上方滚动没有意义,所以我最终使用了 CoordinatorLayout
<CoordinatorLayout> <-- width/height = match_parent
<AppBarLayout> <-- width = match_parent, height = wrap_content
<ImageView/>
<TextView/>
<Button/>
<TabLayout/>
<AppBarLayout/>
<ViewPager/> <-- width/height = match_parent, app:layout_behavior="@string/appbar_scrolling_view_behavior"
<CoordinatorLayout/>
并且 ViewPager
中插入的每个片段现在都包裹在 NestedScrollView
中。
感谢其他回答。它可能会对其他人有所帮助!
这感觉很简单,但不知何故我被困住了。该视图不允许我滚动它。就好像没有计算 ViewPager
中膨胀的片段的高度。搜索 SO 建议我需要编写自己的 ViewPager
并覆盖 onMeasure()
,但我不敢相信我会为了这么简单的事情而走那么远。
这是我的布局,为方便起见进行了一些简化。 ViewPager
填充了 space 超出屏幕(垂直)的片段。尽管如此,屏幕上的任何内容都不可滚动。这是为什么?
<ScrollView
android:id="@+id/scroll_view"
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:fillViewport="true">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/header_image_view"
android:layout_width="0dp"
android:layout_height="170dp"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/title_text_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/header_image_view"/>
<Button
android:id="@+id/resume_training_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/title_text_view"/>
<android.support.design.widget.TabLayout
android:id="@+id/lesson_table_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
app:layout_constraintTop_toBottomOf="@id/resume_training_button">
</android.support.design.widget.TabLayout>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/lesson_table_layout">
</android.support.v4.view.ViewPager>
</android.support.constraint.ConstraintLayout>
</ScrollView>
这是一个示例视图。 Lorem ipsum 文本会持续很长时间,我希望整个屏幕都可以滚动,但事实并非如此。
提前致谢!
有这样的问题,有时ScrollView
和ViewPager
切换焦点。如果你在 ScrollView
中有一个 ViewPager
并且你希望它在你触摸它时始终保持焦点并且 ScrollView
永远不会获得焦点,那么设置 requestDisallowInterceptTouchEvent
就可以了.
mViewPager= (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(adapter);
mViewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mViewPager.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
在此thread
中查找更多答案编辑:
另一种我认为可能有效的方法是以编程方式设置滚动到您的 tablayout
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
尝试使用 nestedScrollView 而不是 scrollView.. 尝试以下代码片段..
<android.support.v4.widget.NestedScrollView 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"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@id/fragment_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="fill_vertical"
android:orientation="vertical">
...Content...
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/lesson_table_layout">
</android.support.v4.view.ViewPager>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
我最后重写了很多。根据
,在TabLayout
上方滚动没有意义,所以我最终使用了 CoordinatorLayout
<CoordinatorLayout> <-- width/height = match_parent
<AppBarLayout> <-- width = match_parent, height = wrap_content
<ImageView/>
<TextView/>
<Button/>
<TabLayout/>
<AppBarLayout/>
<ViewPager/> <-- width/height = match_parent, app:layout_behavior="@string/appbar_scrolling_view_behavior"
<CoordinatorLayout/>
并且 ViewPager
中插入的每个片段现在都包裹在 NestedScrollView
中。
感谢其他回答。它可能会对其他人有所帮助!