Android 协调布局(CL)中的嵌套滚动视图(NSV):加载时NSV不在顶部

Android 协调布局(CL)中的嵌套滚动视图(NSV):加载时NSV不在顶部,android,scrollview,material-design,android-coordinatorlayout,Android,Scrollview,Material Design,Android Coordinatorlayout,我在CL中使用NSV,以便在NSV向下滚动时能够压缩工具栏。我遇到的问题是,我的NSV在加载时没有滚动到顶部,相反,它从NSV顶部偏移了相当大的裕度(我不确定这个间距是从哪里来的,它不在布局中) 请查看屏幕截图,第一个显示NSV如何加载,通过比较第二个(当我手动将NSV滚动到顶部时),您可以清楚地看到NSV已从顶部向下滚动了相当多: 我对这个布局做了一些更新,它导致了这种情况的发生,以前,它是在顶部加载的,没有问题。然而,我并没有添加任何应该导致这种情况的间距 以下是我用于此的布局: <

我在CL中使用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>


任何想法都将不胜感激

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

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

其次,修复:我通过将所有视图设置为在xml布局中具有android:visibility=“gone”来修复此问题,然后根据需要切换每个视图的可见性。以前,视图在默认情况下是可见的,然后我从那里开始工作。我只需要改变我的逻辑,让它们都消失,这并不难


我认为这是可行的,因为在onCreateView()中创建NSV时,运行时要隐藏的视图不会构成总高度计算的一部分。一旦片段经过onCreateView(),动态更改视图是安全的,但是,如果视图作为onCreateView()中高度的一部分进行计算,然后使用View.GONE隐藏,测量结果不稳定,结果列表明显向下滚动。

您是否尝试过在视图组中添加下一行,即案例中的FrameLayout

android:descendantFocusability="blocksDescendants"
我想这对你也有用


如果不是的话,试着在NSV中添加它。

你的帖子回答帮助我找到了很多问题(顺便说一句,也是一样的)。但我用另一种方式工作。我猜您使用的是
回收视图
。在我的例子中,我使用的是3
RecyclerViews
。嗯,从你的回答中,我开始隐藏回收商,我发现只有其中一个造成了这个问题。我所做的是用postDelayed填充:

new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                recyler.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
                recyler.setAdapter(new MyAdapter(myList));
            }
        }, 3000);

那很好

在我的例子中,在我滚动内容的底部附近有一个
EditText
,它抓住了焦点。由于
NestedScrollView
做了一些奇怪的布局工作,活动开始时聚焦视图没有滚动到顶部,因此真正的原因并不明显。将此添加到嵌套滚动视图的子布局中,为我修复了它:

android:focusableInTouchMode="true"

在这种情况下,这意味着什么?嗨,Octavio,我不建议使用延迟来解决这个问题。延迟是不必要的,并且3秒太长。谷歌的指导方针建议页面应该在16毫秒内呈现(不包括动画),所以这可能会让用户感到沮丧。