11

我在 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>

任何想法,将不胜感激!

4

4 回答 4

7

好的!经过一天的调试我的布局和片段的每个组件后,我发现了我认为是错误的地方。

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

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

我认为这是可行的,因为当在 onCreateView() 中创建 NSV 时,您要在运行时隐藏的视图不构成整体高度计算的一部分。一旦片段通过 onCreateView(),动态更改视图是安全的,但是,如果视图被计算为 onCreateView() 中的高度的一部分,然后用 View.GONE 隐藏,测量会变得不稳定,最终会得到一个列表显着向下滚动。

于 2015-07-06T19:24:44.547 回答
4

您是否尝试在您的视图组中添加以下行,即您的情况下的 FrameLayout

android:descendantFocusability="blocksDescendants"

我认为这也对你有用。

如果不尝试在 NSV 中添加。

于 2015-08-14T07:12:48.217 回答
1

就我而言,EditText滚动内容的底部附近有一个吸引焦点的地方。由于NestedScrollView做了一些奇怪的布局,所以当活动开始时,焦点视图没有滚动到顶部,所以真正的原因并不明显。将此添加到NestedScrollView的子布局中为我修复了它:

android:focusableInTouchMode="true"
于 2016-04-07T15:19:21.537 回答
0

你的帖子回答帮助我找到了我的问题(顺便说一句,它是一样的)。但我得到了它以不同的方式工作。我猜你正在使用RecyclerView. 就我而言,我使用的是 3 RecyclerViews。好吧,从你的回答中,我开始隐藏回收商,我发现只有其中一个导致了这个问题。我所做的是填充了一个 postDelayed:

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

效果很好!

于 2016-03-09T17:14:39.183 回答