android - ViewPager 中的 fragment 未触发协调器布局上的滚动

标签 android android-viewpager android-scrollview android-coordinatorlayout

所以,我有一个带有 CoordinatorLayout 的 MainActivity,可以在 Android 上实现很酷的滚动效果。 这是我的activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="br.com.alberson.apontadordehoras.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/appbar_padding_top"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay">

        </android.support.v7.widget.Toolbar>

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

这是我的fragment.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    tools:context="br.com.alberson.apontadordehoras.MesFragment">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="@dimen/activity_vertical_margin"
        android:layout_marginEnd="@dimen/activity_horizontal_margin"
        android:layout_marginLeft="@dimen/activity_horizontal_margin"
        android:layout_marginRight="@dimen/activity_horizontal_margin"
        android:layout_marginStart="@dimen/activity_horizontal_margin"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:orientation="vertical">

        <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:elevation="@dimen/cardview_default_elevation"
            android:padding="@dimen/fab_margin"
            card_view:cardCornerRadius="@dimen/cardview_default_radius">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="@dimen/activity_vertical_margin"
                android:layout_marginEnd="@dimen/activity_horizontal_margin"
                android:layout_marginLeft="@dimen/activity_horizontal_margin"
                android:layout_marginRight="@dimen/activity_horizontal_margin"
                android:layout_marginStart="@dimen/activity_horizontal_margin"
                android:layout_marginTop="@dimen/activity_vertical_margin"
                android:orientation="vertical">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="top|start"
                    android:text="@string/realizado" />

                <TextView
                    android:id="@+id/mes_realizado"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginBottom="@dimen/activity_vertical_margin"
                    android:layout_marginTop="@dimen/activity_vertical_margin"
                    android:gravity="center"
                    android:text="70 horas"
                    android:textSize="38sp"
                    android:textStyle="bold" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="top|start"
                    android:text="@string/media_por_dia" />

                <TextView
                    android:id="@+id/mes_media_por_dia"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginBottom="@dimen/activity_vertical_margin"
                    android:layout_marginTop="@dimen/activity_vertical_margin"
                    android:gravity="center"
                    android:text="8,5 horas"
                    android:textSize="38sp"
                    android:textStyle="bold" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="top|start"
                    android:text="@string/horas_dia_meta" />

                <TextView
                    android:id="@+id/mes_horas_dia_para_meta"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginBottom="@dimen/activity_vertical_margin"
                    android:layout_marginTop="@dimen/activity_vertical_margin"
                    android:gravity="center"
                    android:text="8,5 horas"
                    android:textSize="38sp"
                    android:textStyle="bold" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="top|start"
                    android:text="@string/horas_dia_previsto" />

                <TextView
                    android:id="@+id/mes_horas_dia_para_previsto"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginBottom="@dimen/activity_vertical_margin"
                    android:layout_marginTop="@dimen/activity_vertical_margin"
                    android:gravity="center"
                    android:text="8,5 horas"
                    android:textSize="38sp"
                    android:textStyle="bold" />
            </LinearLayout>
        </android.support.v7.widget.CardView>

        <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/activity_vertical_margin"
            android:layout_marginTop="@dimen/activity_vertical_margin"
            android:elevation="@dimen/cardview_default_elevation"
            android:padding="@dimen/fab_margin"
            card_view:cardCornerRadius="@dimen/cardview_default_radius">

            <android.support.v7.widget.GridLayout xmlns:grid="http://schemas.android.com/apk/res-auto"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginBottom="@dimen/activity_vertical_margin"
                android:layout_marginEnd="@dimen/activity_horizontal_margin"
                android:layout_marginLeft="@dimen/activity_horizontal_margin"
                android:layout_marginRight="@dimen/activity_horizontal_margin"
                android:layout_marginStart="@dimen/activity_horizontal_margin"
                android:layout_marginTop="@dimen/activity_vertical_margin"
                grid:columnCount="2">

                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:orientation="vertical"
                    grid:layout_columnWeight="1"
                    grid:layout_gravity="fill_horizontal">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:gravity="center"
                        android:text="@string/meta_desejada" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="200 horas"
                        android:textStyle="bold" />
                </LinearLayout>

                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:orientation="vertical"
                    grid:layout_columnWeight="1"
                    grid:layout_gravity="fill_horizontal">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:gravity="center"
                        android:text="@string/meta_desejada" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="200 horas"
                        android:textStyle="bold" />
                </LinearLayout>

                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/activity_vertical_margin"
                    android:orientation="vertical"
                    grid:layout_columnSpan="2"
                    grid:layout_gravity="fill_horizontal">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:text="@string/dias_uteis_restantes" />

                    <TextView
                        android:id="@+id/mes_dias_uteis_restantes"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:layout_marginTop="@dimen/activity_vertical_margin"
                        android:text="5"
                        android:textStyle="bold" />

                </LinearLayout>
            </android.support.v7.widget.GridLayout>
        </android.support.v7.widget.CardView>
    </LinearLayout>
</ScrollView>

在分页器中,有 2 个页面,每个页面有一个 fragment 。

我有两个问题:

1) 此 fragment 中的 ScrollView 甚至不显示,然后不使用 CoordinatorLayout 滚动。

2) 如果我向上滚动 TabLayout,内容会向上滚动并且工具栏会隐藏,这是我在 ViewPager 中滚动 fragment 时预期的行为。

我做错了什么?

最佳答案

使用 NestedScrollView 代替 ScrollView .

CoordinatorLayout 提供的折叠工具栏行为要求滚动元素支持嵌套滚动。这是将滚动事件一直传播到 AppBarLayout 和工具栏所必需的。

如果您只支持 api-21 及更高版本,您可以使用 ScrollView 或 ListView 并调用 setNestedScrollingEnabled(true) , 它会起作用。

为了支持较低的 api 级别,请使用本身支持嵌套滚动的支持库类,例如 NestedScrollViewRecyclerView .

关于android - ViewPager 中的 fragment 未触发协调器布局上的滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35806990/

相关文章:

Android LinearLayout 中的 ScrollView

android - Gradle 复合构建找不到包含的项目依赖项

android - 如何检测(java代码) "box type"google TV或带有内置显示屏的google TV ("TV type")

android - 添加来自 android webview 的自定义 header

java - 如何将 URI 转换为 Marshmallow 中的真实路径?

java - ViewPager java.lang.OutOfMemoryError : bitmap size exceeds VM budget 错误

android - 在 viewpager 中检测触摸/点击事件

android - 在 scrollView android 上实现缩放

android - 为什么 ViewPager 在 android 中得到错误的位置?

android - Dynamic Endless RecyclerView 滚动问题