【问题标题】:Fragment in ViewPager not triggering scroll on Coordinator LayoutViewPager 中的片段未触发协调器布局上的滚动
【发布时间】:2016-03-04 22:08:19
【问题描述】:

所以,我有一个带有 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 个页面,每个页面有一个片段。

我有两个问题:

1) 这个片段内的 ScrollView 甚至不显示,然后不使用 CoordinatorLayout 滚动。

2) 如果我向上滚动 TabLayout,则内容向上滚动并且工具栏变为隐藏,这是我在 ViewPager 中滚动片段时所期望的行为。

我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    使用 NestedScrollView 代替 ScrollView。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 2016-01-03
      • 2016-01-15
      • 2015-11-02
      • 1970-01-01
      • 2018-11-07
      • 2020-05-30
      相关资源
      最近更新 更多