CoordinatorLayout(CL)中的NestedScrollView(NSV):NSV在加载时不在顶部

Aut*_*M8R 11 android scrollview material-design android-coordinatorlayout

我在CL中使用NSV,以便在NSV向下滚动时让工具栏压缩.我遇到的问题是我的NSV在加载时没有滚动到顶部,相反,它从NSV的顶部偏移了相当大的余量(我不确定这个间距来自哪里,它不在布局).

请看一下屏幕截图,第一个显示NSV如何加载,你可以清楚地看到NSV通过比较第二个(当我手动将NSV滚动到顶部时)从顶部向下滚动了很多:

当NSV加载时,它不在顶部 为了比较,NSV手动滚动到顶部

我对此布局进行了一些更新,这导致了这种情况发生,之前,它在顶部加载而没有问题.但是,我没有添加应该导致这种情况的任何间距.

这是我正在使用的布局:

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/cl_goal_detail"
    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="0dp"
    android:layout_weight="1">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/abl_goal_detail"
        android:layout_width="match_parent"
        android:layout_height="144dp"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar_goal_detail"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="@dimen/content_space_double"
            app:collapsedTitleTextAppearance="@style/title.dark"
            app:expandedTitleTextAppearance="@style/display3.plus.dark"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar_goal_detail"
                style="@style/toolbar"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/nsv_goal_detail"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/content_space_half"
        android:paddingLeft="@dimen/content_space_half"
        android:paddingRight="@dimen/content_space_half"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <FrameLayout
            android:id="@+id/container_goal_detail"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="fill_vertical"/>
    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

任何想法,将不胜感激!

Aut*_*M8R 7

好!经过一整天的调试我的布局和Fragment的每一个组件后,我确定了我认为是一个bug.

首先,问题是:在NSV的子视图中有元素会在运行时更改View.GONE的可见性,导致列表向下滚动.我注意到列表滚动到切换可见性的元素上方(包括在视图上设置的任何边距).

二,修复:我通过在xml布局中将所有视图设置为android:visibility ="gone"来修复此问题,然后,根据需要切换每个视图的可见性.以前,默认情况下可以看到视图,然后我从那里开始工作.我只需要改变我的逻辑,从他们开始,所有的GONE,而不是非常困难.

我认为这是有效的,因为在onCreateView()中创建NSV时,您将在运行时隐藏的视图不会形成整体高度计算的一部分.一旦片段进入onCreateView(),就可以安全地动态更改视图,但是,如果视图计算为onCreateView()中的高度部分,然后使用View.GONE隐藏,那么测量结果会很糟糕,最终会得到一个列表向下滚动显着.