Как сделать, чтобы ViewPager помещался внутри ScrollView и прокручивал все представление как одну часть?


У меня есть активность, для которой viewpager внутри scrollview следующим образом

            <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">


                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">

                    <!--someViews-->

                </LinearLayout>


                <!--then viewPager-->
                <androidx.viewpager.widget.ViewPager
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" />

            </LinearLayout>

        </ScrollView>

Затем пейджер просмотра содержит несколько фрагменты, которые имеют высокий посмотреть тоже. Проблема заключается в том, что представление прокрутки не прокручивается, потому что представление не нужно прокручивать, но представление внутри фрагмента пейджера не прокручивается, поэтому можно ли сделать весь вид, включая пейджер внутреннего вида, прокручиваемым как один вид? То, что я говорю, что мне не нужно прокручивать фрагмент просмотра пейджера как отдельную часть, мне нужно прокручивать его как часть представления активности.

Спасибо


person Tefa    schedule 28.02.2019    source источник


Ответы (1)


Я считаю, что настройка, которую вы ищете, будет работать внутри CoordinatorLayout с использованием виджета NestedScrollView следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical">

      <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/app_name"
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Display1" />

      <TextView
        android:id="@+id/subTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/subtitle"
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Body1" />

      <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="300dp" />
    </LinearLayout>

  </androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

Я только что проверил это на примере проекта с одним текстовым представлением во фрагменте, и мне удалось как прокручивать представление, так и пролистывать страницы.

Обратите внимание: мне нужно было указать определенную высоту для ViewPager, чтобы он отображался.

Удачи и счастливого кодирования!

person kandroidj    schedule 28.02.2019
comment
да, это сработало, когда я поставил высокий уровень для вьюпейджера, но мне не нужно этого делать, потому что я не знаю, какой высокий будет достаточно для фрагмента внутри вьюпейджера - person Tefa; 02.03.2019
comment
@Tefa, если это так, то ViewPager - не тот виджет, который следует использовать. Рассмотрите возможность использования RecyclerView с горизонтальным LayoutManager, хотя NestedScrollView все равно будет применяться. - person kandroidj; 02.03.2019
comment
Я уже удалил recycler-view и использовал FrameLayout и заменил на нем некоторые фрагменты - person Tefa; 04.03.2019
comment
Это работает хорошо, но почему мы должны использовать фиксированную высоту? Потому что жесткий код не рекомендуется. Есть ли другой способ ? Спасибо. - person Mehmet Gür; 01.06.2020
comment
@MehmetGür я считаю, что NestedScrollView оборачивает свое содержимое, поэтому, несмотря на то, что в макете указано соответствие родителю, он не знает, насколько большим будет рисовать себя, поэтому вместо этого нужно изменить размер дочернего элемента. - person kandroidj; 02.06.2020