NestedScrollView (NSV) в CoordinatorLayout (CL): NSV не сверху при загрузке
Я использую NSV в CL для возможности сжимать панель инструментов, когда NSV прокручивается вниз. Проблема, с которой я столкнулась, заключается в том, что мой NSV не прокручивается наверху, когда он загружается, вместо этого он полностью компенсируется сверху NSV (я не уверен, откуда это расстояние, это не в макет).
Пожалуйста, взгляните на экранные снимки, первый показывает, как загружается NSV, и вы можете четко видеть, что NSV немного прокручивается сверху, сравнивая второй (когда я просматриваю NSV вверху вручную ):
![click to enlarge 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>
Любые идеи будут оценены!
Ответы
Ответ 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);
Это сработало хорошо!