Подтвердить что ты не робот

NestedScrollView (NSV) в CoordinatorLayout (CL): NSV не сверху при загрузке

Я использую NSV в CL для возможности сжимать панель инструментов, когда NSV прокручивается вниз. Проблема, с которой я столкнулась, заключается в том, что мой NSV не прокручивается наверху, когда он загружается, вместо этого он полностью компенсируется сверху NSV (я не уверен, откуда это расстояние, это не в макет).

Пожалуйста, взгляните на экранные снимки, первый показывает, как загружается NSV, и вы можете четко видеть, что NSV немного прокручивается сверху, сравнивая второй (когда я просматриваю NSV вверху вручную ):

When NSV loads, it's not at the top NSV scrolled to the top manually for comparison sake

Я сделал некоторые обновления для этого макета, и это вызвало это, раньше он загружался сверху без проблем. Однако я не добавил никаких интервалов, которые должны были вызвать это.

Вот макет, который я использую для этого:

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

Любые идеи будут оценены!

4b9b3361

Ответ 1

OK! После прочного ДНЯ отладки каждого отдельного компонента моего макета и фрагмента я определил, что, по моему мнению, является ошибкой.

Во-первых, проблема: Оказывается, что наличие элементов вашего дочернего представления NSV, которые изменяют видимость в View.GONE во время выполнения, заставляет список прокручиваться вниз. Я заметил, что список прокручивается чуть выше элемента, в котором была изменена видимость (включая любые поля, установленные в представлении).

Во-вторых, исправление: я исправил эту проблему, установив для всех представлений андроид: visibility = "gone" в макете xml, затем я переключаю каждую видимость вида по мере необходимости. Раньше представления были видны по умолчанию, а затем я работал оттуда. Мне просто нужно было изменить свою логику, чтобы начать с них все GONE, а не ужасно сложно.

Я предполагаю, что это работает, потому что представления, которые вы собираетесь скрывать во время выполнения, не составляют часть общего расчета высоты при создании NSV в onCreateView(). Однако, если фрагмент прогрессирует в onCreateView(), он безопасен для динамического изменения представлений, однако, если представления вычисляются как часть высоты в onCreateView() и THEN, скрытые с помощью View.GONE, измерения становятся неустойчивыми, и вы получаете список значительно прокручивается.

Ответ 2

Вы пытались добавить строку ниже в своей группе просмотра, то есть FrameLayout в вашем случае

android:descendantFocusability="blocksDescendants"

Я думаю, что это тоже сработает для вас.

Если вы не попробуете его добавить в NSV.

Ответ 3

В моем случае в нижней части моего прокручиваемого содержимого, который захватывал фокус, был EditText. Поскольку NestedScrollView делает некоторые странные макеты, сфокусированный взгляд не прокручивался вверх, когда началась деятельность, поэтому реальная причина не была очевидна. Добавление этого в дочерний макет NestedScrollView исправил его для меня:

android:focusableInTouchMode="true"

Ответ 4

Ваш ответ на сообщение помог мне много узнать мою проблему (кстати, все было так). Но я сработал по-другому. Думаю, вы используете RecyclerView. В моем случае я использую 3 RecyclerViews. Ну, из вашего ответа я начал скрывать переработчиков, и я узнал, что только один из них вызывал эту проблему. То, что я сделал, - это заполнение почтой:

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

Это сработало хорошо!