ViewPager в NestedScrollView


111

Мені потрібно створити інтерфейс на кшталт Google Newssstand, який є свого роду ViewPager (горизонтальна прокрутка) над заголовком, що згортається (вертикальна прокрутка). Однією з моїх вимог є використання нової бібліотеки підтримки дизайну, представленої на Google IO 2015. ( http://android-developers.blogspot.ca/2015/05/android-design-support-library.html )

На основі вибірки, створеної Крісом Бейнсом ( https://github.com/chrisbanes/cheesesquare ), я дійшов до того, що я в змозі виконати руйнуючу поведінку, але з базовим LinearLayout (без горизонтальної прокрутки).

Я спробував замінити LinearLayout ViewPager, і у мене з’явився порожній екран. Я грав з: шириною, вагою та всіма видами груп перегляду, але .... все-таки порожнім екраном. Схоже, ViewPager і NestedScrollView не подобаються один одному.

Я спробував вирішити за допомогою HorizontalScrollView: він працює, але я втрачаю перевагу функції PagerTitleStrip та фокус на одній панелі (я можу зупинити горизонтально між 2 панелями).

Зараз у мене більше немає ідей, якщо хтось може привести мене до рішення ...

Дякую

Ось мій останній файл компонування:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    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="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/header_height"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <include
                layout="@layout/part_header"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_collapseMode="parallax"/>

            <android.support.v7.widget.Toolbar
                android:id="@+id/activity_main_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                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/activity_main_nestedscrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.v4.view.ViewPager
            android:id="@+id/activity_main_viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FFA0"/>


    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

Ви пробували обгортати ViewPagerвсередині LinearLayout? Просто цікаво, чи це призведе ViewPagerналежним чином.
CzarMatt

Так, я намагався, але все-таки результат. Я робив багато тестів з багатьма компонентами, але ViewPager ніколи не надається в NestedScrollView незалежно від ієрархії
Kyso84

Я щойно створив тестовий додаток із ViewPagerвнутрішнім а, NestedScrollViewяк єдиним макетом - здавалося, добре працює. Я також зміг DrawerLayoutуспішно впасти . Можливо, є ще один аспект вашого коду, який заважає потрібній вам функції. Хочете поділитися більшою частиною свого джерела?
CzarMatt

Нічого собі, значить, ви можете провести пальцем вліво / вправо і вгору / вниз? Я просто використовую FragmentPagerAdapter для відображення фрагментів у своєму пейджері. Чи можете ви натомість поділитися своїм зразком коду?
Kyso84

Тут я вставив простий макет прикладу: pastebin.com/jXPw6mtf Редагувати: Ви можете завантажити будь-який фрагмент, який вам потрібно ViewPager. Я можу прокручувати види вгору і вниз, а також прокручувати ViewPagerвліво / вправо.
CzarMatt

Відповіді:


128

Я зустрічаю цю проблему, і вирішую її setFillViewport (true)

<android.support.v4.widget.NestedScrollView
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:id="@+id/nest_scrollview"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="mio.kon.yyb.nestedscrollviewbug.ScrollingActivity"
tools:showIn="@layout/activity_scrolling">


    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

у діяльності

  NestedScrollView scrollView = (NestedScrollView) findViewById (R.id.nest_scrollview);
    scrollView.setFillViewport (true);

введіть тут опис зображення


31
Зауважте, що це можна встановити і в XML, просто додайте android:fillViewport="true"до NestedScrollViewоб'єкта. Документація описує цей атрибут як Defines whether the scrollview should stretch its content to fill the viewport..
Krøllebølle

7
Це не вирішує проблему прокрутки у фрагментах заповнювачів
Atieh

3
Дякую! Я сів android:fillViewport="true"на NestedScrollViewі всередині fragmentу мене , listViewде я сидів android:nestedScrollingEnabled="true".. Виправлений скролінг питання
radubogdan

@ Krøllebølle NestedScrollView не має цього атрибуту, його потрібно встановити програмно.

Так, це працює для мене. У мене проблема, коли я встановив висоту viewpager на відповідність прозорим усередині NestedScrollView, він не показував види.
Waheed

71

Гаразд, я зробив невелику демонстрацію з ViewPagerі NestedScrollView. Проблема, з якою я стикався, була з висотою ViewPagerта ListView. Тому я зробив невелику модифікацію ListViewта ViewPager'sвимірювання висоти.

Якщо хтось хотів би переглянути код, ось посилання: https://github.com/TheLittleNaruto/SupportDesignExample/

Вихід:

введіть тут опис зображення


не працює, якщо фрагмент не містить; не має перегляду списку, навіть forlistview його працює, якщо кількість підрахунків елементів однакова для всіх фрагментів.
Панкай Арора

3
Можливо, я трохи запізнююся на вечірку, але я над цим працював сьогодні, і в мене це (в основному) працює з додаванням програми: layout_behavior = "@ string / appbar_scrolling_view_behavior" як на ViewPager, так і на батьківському поданні кожен фрагмент.
Graeme

1
Без сумніву, це працює, але чи це не ускладнює проблему? Я вирішив це, позбувшись NestedScrollViewі використовуючи LinearLayoutзамість цього. Які переваги матиме надпис NestedScrollViewa, LinearLayoutякщо вся мета полягає в прокручуванні вмісту в ViewPager? Будь ласка, виправте мене, якщо я помиляюся. : x Дякую
Судоми

1
Дуже дякую! Я був на місці, коли я витягнув волосся, і ваш WrapContentHeightViewPager працює як шарм. Я у вас в боргу!
Mavamaarten

1
Ідеальне рішення. Дякую. Це працювало для мене .. :)
Mrunal

42

Додайте android:fillViewport="true"у свій NestedScrollView. періоду.


2
вона вирішує проблему, але висота оглядача буде батьківською збігом (вона займає всю висоту сторінки).
Манукумар

27

Замість того, щоб розміщувати ViewPager всередині NestedScrollView, зробіть це навпаки.

Помістіть NestedScrollView в дочірніх переглядах всередині ViewPager, що по суті є компонуванням фрагмента. Також дуже ймовірно, що вам навіть не потрібно буде використовувати NestedScrollView, якщо макет списку Вашого фрагмента дуже простий.

Приклад макетів

Схема діяльності:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.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"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:fitsSystemWindows="true"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minHeight="@dimen/app_bar_height"
                android:scaleType="centerCrop"
                android:src="@drawable/my_bg"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.8"
                app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.design.widget.TabLayout
            android:id="@+id/content_tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

Якщо TabLayout вам не потрібен, ви можете скинути LinearLayout і зробити ViewPager автономним. Але обов'язково використовуйте app:layout_behavior="@string/appbar_scrolling_view_behavior"в атрибутах ViewPager.

Простий макет фрагмента:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Макет складного фрагмента:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillViewport="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Hello World"/>
    </RelativeLayout>
</android.support.v4.widget.NestedScrollView>

Приклад програми: CollapsingToolbarPoc

введіть тут опис зображення


Це той, хто зробив це для мене. Дякую!
rjr-apps

Здравствуйте, Іно, це, здається, працює, але коли я додаю ще один погляд на TabLayout, його розрив. Чи можете ви допомогти?
hushed_voice

Ти врятував мої дні. :)
androidXP

20

Були ті самі питання.

Якщо розмістити NestedScrollView навколо ViewPager, це не працюватиме.

Однак DID працює над тим, що розміщує NestedScrollView всередині макета фрагмента, який я завантажую всередину ViewPager.

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@id/fragment_detail"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="fill_vertical"
            android:orientation="vertical">
    ...Content...
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>


Чи працює, якщо вміст був макетом координатора з іншим NestedScrollView? І чи відповідає батьківський координатор-макет подій прокрутки там?
Атьє

Ця робота для мене. Я додаю NestedScrollView до кожного елемента мого ViewPager замість ViewPager. Дякую.
jerogaren

У мене є swipefreshlayout у фрагменті, згідно з рішенням ур, я помістив NestedScrollview у фрагмент, вище swipeRefreshLayout .. тоді дані не завантажуються. Це не працювало.
Палак Дарджи

16

Ви можете спробувати так, viewpager працює добре, але висота оглядача фіксована.

Я все ще знаходжу краще рішення ..., тому, будь ласка, повідомте мене, будь-який момент може зробити це краще, дякую

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

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

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

Чи намагалися ви інкапсулювати його в "android.support.design.widget.CoordinatorLayout" та на руйнуючу панель інструментів?
Kyso84

Ви, здається, вирішуєте, що проблема у висоті. Знайшли якісь вдосконалення @Paul?
jasxir

3
Цей працював для мене, але мені також довелося викликати setFillViewport (true) на вкладеному перегляді.
larrytech

12

У мене була та сама проблема, і якраз її виправили деякі зміни. ViewPagerне працює в межах NestedScrollView. Просто поставте їх ViewPagerяк безпосереднього дитини CoordinatorLayout. Тоді вміст кожного фрагмента ViewPager має бути доданий NestedScrollView. Це воно.


навіть якщо вміст був макетом координатора з іншим NestedScrollView?
Атьє

1
Дані перегляду списку фрагментів не завантажуються таким чином!
Палак Дарджі

5

Вам не потрібно використовувати NestedScrollView, щоб мати паралаксальні ефекти. спробуйте щось подібне:

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:animateLayoutChanges="true">

        <android.support.v7.widget.Toolbar
            android:id="@+id/my_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|enterAlways"/>

        <android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/my_tab_layout"
            android:fillViewport="false"
            app:tabMode="fixed"/>
     </android.support.design.widget.AppBarLayout>

            <android.support.v4.view.ViewPager
                android:id="@+id/my_view_pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</android.support.design.widget.CoordinatorLayout>

3
Це буде працювати, якщо всі ваші ViewPagerфрагменти будуть ефіром RecyclerView, або NestedScrollView. Якщо їх немає (наприклад ListView), тоді потрібно вирішити проблему для Lollipop і вищеlistView.setNestedScrollingEnabled(true)
AndyDeveloper

нарешті щось працює, не додаючи додатковий контейнер прокрутки! До речі, ви можете встановити цей набірNestedScrollingEnabled (true) і в xml: android: nestedScrollingEnabled = "true"
Аналізатор

1
Якщо я запускаю додаток, згортайте панель інструментів, перебуваючи на одній вкладці, перемикайте вкладку, а потім тягніть панель інструментів назад вниз, вона порожня. Доведеться перемикати вкладки, хоча він перебуває у не згорнутому стані, щоб повернути його знову. Так близько, але поки що :(
мені--

4

У мене був макет із панеллю інструментів додатка з NestedScrollView під ним, тоді всередині вкладеної панелі інструментів був LinearLayout, нижче LinearLayout був пейджер перегляду. Ідея полягала в LinearLayout усередині NestedScrollView - виправлено - ви можете ковзати вліво / вправо між видами пейджера перегляду, але цей вміст не переміщуватиметься, принаймні по горизонталі . Ви все ще повинні мати можливість прокручувати весь вміст вертикально через вкладений вигляд прокрутки. То була ідея. Тому я встановив вкладену висоту NestedScrollView у відповідність_прозраку, заповнити область перегляду, а потім усі дочірні макети / ViewPager на wrap_content.

У моїй голові це було правильно. Але це не спрацювало - ViewPager дозволив мені рухатись вліво / вправо, але не вертикальна прокрутка, незалежно від того, переміщений вміст сторінки viewpager в нижній частині поточного екрану чи ні. Виявляється, це було в основному тому, що ViewPager не поважає wrap_content на різних його сторінках.

Я обминув це, підкласифікувавши ViewPager, щоб змусити його змінювати висоту залежно від поточного вибраного елемента, на зразок змушуючи його вести себе як layout_height = "wrap_content":

public class ContentWrappingViewPager extends ViewPager {

    public ContentWrappingViewPager(Context context) {
        super(context);
    }

    public ContentWrappingViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int height = 0;
        if (getChildCount() > getCurrentItem()) {
            View child = getChildAt(getCurrentItem());
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if(h > height) height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

Рішення надихнуло цю відповідь . Працювали для мене!


але перегляд прокрутки автоматично прокручується вгору? як це виправити?
Вівек Кумар

4

просто поставте цей рядок у NestedScrollView

android:fillViewport="true"

Тони подяки Що робити, якщо я хочу прокрутити, торкнувшись безпосередньо CollapsingToolbarLayout?
Pratik Saluja

3

Я видалив NestedScrollView з основного макета і вставив його як Батько у всі мої макети фрагментів, які мали завантажуватись у ViewPager, вирішив цю проблему для мене.


3

Використовуйте нижче індивідуальний клас, щоб вирішити свою проблему. Не забудьте зателефонувати на метод onRefresh () на сторінкуchangelistener.

public class ContentWrappingViewPager extends ViewPager
{
    private int width = 0;
    public ContentWrappingViewPager(Context context) {
        super(context);
    }

    public ContentWrappingViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        int height = 0;
        width = widthMeasureSpec;
        if (getChildCount() > getCurrentItem()) {
            View child = getChildAt(getCurrentItem());
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if(h > height) height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void onRefresh()
    {
        try {
            int height = 0;
            if (getChildCount() > getCurrentItem()) {
                View child = getChildAt(getCurrentItem());
                child.measure(width, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                int h = child.getMeasuredHeight();
                if(h > height) height = h;
            }

            int heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
            ViewGroup.LayoutParams layoutParams = this.getLayoutParams();
            layoutParams.height = heightMeasureSpec;
            this.setLayoutParams(layoutParams);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2

У мене була подібна проблема (але без CollapsingToolbarLayout, просто проста Toolbar+ TabLayoutв межах AppBarLayout). Я хотів, щоб Панель інструментів прокручувалась із поля зору, коли прокручувала вміст а ViewPagerв межах NestedScrollView.

Мій макет вийшов приблизно так:

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true">

            <android.support.v7.widget.Toolbar
                android:id="@+id/my_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways"/>

            <android.support.design.widget.TabLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/my_tab_layout"
                android:fillViewport="false"
                app:tabMode="fixed"/>
         </android.support.design.widget.AppBarLayout>

         <android.support.v4.widget.NestedScrollView
                android:id="@+id/container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fillViewport="true"
                android:layout_gravity="fill_vertical"
                app:layout_behavior="@string/appbar_scrolling_view_behavior">

                <android.support.v4.view.ViewPager
                    android:id="@+id/my_view_pager"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                     app:layout_behavior="@string/appbar_scrolling_view_behavior">
                </android.support.v4.view.ViewPager>
         </android.support.v4.widget.NestedScrollView>

</android.support.design.widget.CoordinatorLayout>

Цей макет не працював за призначенням, але я вирішив його, просто позбувшись NestedScrollViewі використовуючи LinearLayoutнатомість. Він працював для мене відразу на Android Support Library v23.1.0. Ось як закінчився макет:

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true">

            <android.support.v7.widget.Toolbar
                android:id="@+id/my_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways"/>

            <android.support.design.widget.TabLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/my_tab_layout"
                android:fillViewport="false"
                app:tabMode="fixed"/>
         </android.support.design.widget.AppBarLayout>

         <LinearLayout
            android:orientation="vertical"
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="4dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

                <android.support.v4.view.ViewPager
                    android:id="@+id/my_view_pager"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                     app:layout_behavior="@string/appbar_scrolling_view_behavior">
                </android.support.v4.view.ViewPager>
         </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

PS: Це були фактично два файли компонування в моєму проекті. Я скопіював їх і вставив сюди і спробував структурувати їх так, як це виглядатиме в одному файлі. Вибачте, якщо я підкрутив під час копіювання, але, будь ласка, повідомте мене, чи це так, щоб я міг це виправити.


1

Далі слід забезпечити належну висоту пейджера огляду. Фрагмент - це перший фрагмент, наданий пейджером перегляду.

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

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

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <fragment
            class="com.mydomain.MyViewPagerFragment"
            android:id="@+id/myFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone"/>

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>

1

У мене таке ж бажання, вкладіть ViewPagerвсередину a NestedScrollView. Але це не працює і для мене. У моєму випадку, ViewPagerце всередині, Fragmentтак що я можу перемикати вміст залежно від взаємодії з ящиком. Звичайно, AppBar, колапс тощо, і вся нова функція бібліотеки підтримки повинна працювати.

Якщо користувач вертикально прокручує сторінку в пейджері, я хочу, щоб інші сторінки прокручувались так само, щоб створити користувачеві загальне враження, що сам пейджер прокручується.

Що я зробив, і це працює, - це те, що я більше не вставляю ViewPagerвсередину a NestedScrollView, натомість я вставляю вміст містяться фрагментів всередині a NestedScrollView.

Потім, у випадку прокрутки в одному фрагменті, я повідомляю контейнер про нову позицію прокрутки, яка зберігає його.

Нарешті, по пальцю вліво або вправо, виявленому в пейджері (використовуючи addOnPageChangeListenerпошук стан перетягування), я повідомляю цільовий лівий або правий фрагмент, де він повинен прокручуватися (виходячи з знань контейнера про нього), щоб вирівнятись з фрагмента, з якого я родом.


Отже, ви по суті написали власну програму ViewPager? Чи зможете ви поділитися кодом на цьому?
Йозеф

Я зробив щось подібне до цього (якщо я це правильно зрозумів), який полягає в тому, щоб зробити лінійний макет у вашому макеті координатора, який містить вкладений таблицю (при необхідності) та вікно перегляду, замість вкладеного перегляду прокрутки. Потім самі фрагменти мають вкладений прокрутки як свій кореневий елемент. Це працює для мене, але я б вважав за краще мати один вкладений перегляд, а не повторювати його в кожному фрагменті.
Кріс

0

Я знаю одне робоче рішення: Ви використовуєте Activity, використовуючи CoordinatorLayout, і використовуєте контейнер FrameLayout. Тоді. використовуйте менеджер фрагментів, щоб помістити фрагмент у контейнер Наприклад мій код:

<android.support.design.widget.CoordinatorLayout 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="match_parent"
android:orientation="vertical">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:elevation="0dp">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        app:layout_scrollFlags="scroll|enterAlways"
        android:layout_height="@dimen/toolbar_height"
        android:background="?attr/colorPrimary"
        android:gravity="center">

    </android.support.v7.widget.Toolbar>


</android.support.design.widget.AppBarLayout>

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

</FrameLayout>

І фрагмент:

<LinearLayout 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"
android:orientation="vertical"
tools:context="com.improvemdia.inmyroom.MainFragment">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Потім використовуйте FragmentManager

getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, new MainFragment())
            .commit();

Я думаю, що LinearLayoutвсередині макета Фрагменту тут непотрібне. Дивіться мою відповідь, я використовував LinearLayoutзамість а FrameLayoutу макеті своєї діяльності, а корінь мого фрагмента - це ViewPager (немає макета обгортання).
Судоми

0

Провівши години, спробувавши всі запропоновані вище пропозиції, нарешті я змусив його працювати. Ключ покласти NestedScrollViewвсередину PageViewer, і встановити layout_behaviorв '@string/appbar_scrolling_view_behavior'протягом ДВОХ поглядів. Кінцевий макет виглядає як

<CoordinatorLayout>
    <ViewPager app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <NestedScrollView fillViewport="true" app:layout_behavior="@string/appbar_scrolling_view_behavior">
            <Content>...</Content>
        </NestedScrollView>
    </ViewPager>
    <AppBarLayout>...</AppBarLayout>
</CoordinatorLayout>


0

Насправді NestedScrollView не потрібно бути прямим побратимом CollapsingToolbarLayout в CoordinatorLayout. Я домігся чогось справжнього видовища. Програма appbar_scrolling_view_behavior працює у 2 вкладених фрагментах.

Моя схема діяльності:

<android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.AppBarLayout>

            <android.support.design.widget.CollapsingToolbarLayout>

                <include
                    layout="@layout/toolbar"/>

            </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/container"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</android.support.design.widget.CoordinatorLayout>

У кадрі "контейнер" я надув цей фрагмент:

<android.support.constraint.ConstraintLayout>

    ... some content ...

    <android.support.v4.view.ViewPager/>

    ...

</android.support.constraint.ConstraintLayout>

А фрагменти всередині ViewPager виглядають так:

<RelativeLayout>

    <android.support.v7.widget.RecyclerView/>

    ....

</RelativeLayout>

Факт того, що NestedScrollView може бути настільки глибоким у ієрархії дитячих координацій і розміщення прокрутки, стилістичні роботи мене здивували.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.