ViewPager trong một NestedScrollView


111

Tôi cần tạo giao diện giống như Google Newsstand, đây là một loại ViewPager (cuộn ngang) trên tiêu đề thu gọn (cuộn dọc). Một trong những yêu cầu của tôi là sử dụng Thư viện hỗ trợ thiết kế mới được trình bày tại Google IO 2015. ( http://android-developers.blogspot.ca/2015/05/android-design-support-library.html )

Dựa trên mẫu được tạo bởi Chris Banes ( https://github.com/chrisbanes/cheesesquare ), tôi đã đạt đến điểm rằng tôi có thể thực hiện hành vi thu gọn nhưng với một LinearLayout cơ bản (không có cuộn ngang).

Tôi đã cố gắng thay thế LinearLayout bằng ViewPager và tôi nhận được một màn hình trống. Tôi đã chơi với: chiều rộng, trọng lượng và tất cả các loại nhóm xem nhưng .... vẫn là một màn hình trống. Có vẻ như ViewPager và NestedScrollView không thích nhau.

Tôi đã thử một giải pháp khác bằng cách sử dụng HorizontalScrollView: nó hoạt động nhưng tôi mất lợi ích của tính năng PagerTitleStrip và tiêu điểm trên một bảng điều khiển duy nhất (tôi có thể dừng điều chỉnh theo chiều ngang giữa 2 bảng).

Bây giờ tôi không còn ý tưởng nào nữa, nếu ai đó có thể hướng dẫn tôi một giải pháp ...

Cảm ơn

Đây là tệp bố cục mới nhất của tôi:

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

Bạn đã thử gói ViewPagerbên trong của mình LinearLayoutchưa? Chỉ cần tò mò nếu điều đó sẽ hiển thị ViewPagerđúng.
CzarMatt

Có tôi đã thử nhưng vẫn cho kết quả tương tự. Tôi đã làm nhiều thử nghiệm với nhiều thành phần nhưng ViewPager không bao giờ được thực hiện tại một sự NestedScrollView không có vấn đề phân cấp
Kyso84

Tôi vừa tạo một ứng dụng thử nghiệm với ViewPagerbên trong NestedScrollViewlà bố cục duy nhất - dường như hoạt động tốt. Tôi cũng đã có thể rơi vào một DrawerLayoutthành công. Có lẽ có một khía cạnh khác của mã của bạn ngăn cản chức năng bạn muốn. Muốn chia sẻ thêm nguồn của bạn?
CzarMatt

Chà, vậy là bạn có thể vuốt sang trái / phải và lên / xuống? Tôi chỉ đơn giản là sử dụng FragmentPagerAdapter để hiển thị các đoạn trong máy nhắn tin của mình. Thay vào đó, bạn có thể chia sẻ mã mẫu của mình không?
Kyso84

Tôi đã dán một bố cục ví dụ đơn giản ở đây: pastebin.com/jXPw6mtf Chỉnh sửa: Bạn có thể tải bất kỳ phân đoạn nào bạn muốn trong ViewPager. Tôi có thể cuộn các chế độ xem lên và xuống, cũng như cuộn ViewPagersang trái / phải.
CzarMatt

Câu trả lời:


128

Tôi gặp vấn đề này, tôi giải quyết nó bằng cách 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"/>

trong hoạt động

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

nhập mô tả hình ảnh ở đây


31
Lưu ý rằng điều này cũng có thể được đặt trong XML, chỉ cần thêm android:fillViewport="true"vào NestedScrollViewđối tượng. Các tài liệu mô tả thuộc tính này như Defines whether the scrollview should stretch its content to fill the viewport..
Krøllebølle

7
Điều này không giải quyết vấn đề di chuyển trong mảnh placeholder
Atieh

3
Cảm ơn! Tôi đã ngồi android:fillViewport="true"trên NestedScrollViewvà bên trong fragmenttôi có một listViewnơi tôi ngồi android:nestedScrollingEnabled="true".. Cố định vấn đề di chuyển
radubogdan

@ Krøllebølle NestedScrollView không có thuộc tính này, bạn phải đặt nó theo chương trình.

Vâng, điều này làm việc cho tôi. Tôi gặp sự cố khi đặt chiều cao của viewpager thành match_parent bên trong NestedScrollView, nó không hiển thị các chế độ xem.
Waheed Nazir

71

Được rồi, tôi đã tạo một bản demo nhỏ với ViewPagerNestedScrollView. Vấn đề tôi phải đối mặt là với chiều cao của ViewPagerListView. Vì vậy, tôi đã sửa đổi một chút về ListViewViewPager's đo chiều cao.

Nếu ai muốn xem mã, đây là liên kết: https://github.com/TheLittleNaruto/SupportDesignExample/

Đầu ra:

nhập mô tả hình ảnh ở đây


không hoạt động, nếu phân đoạn không có listview, ngay cả forlistview cũng hoạt động nếu số lượng mục giống nhau cho tất cả các phân đoạn.
Pankaj Arora

3
Tôi có thể đến bữa tiệc hơi muộn nhưng hôm nay tôi đang làm việc này và tôi đã (hầu hết) làm việc với việc thêm ứng dụng: layout_behavior = "@ string / appbar_scrolling_view_behavior" trên cả ViewPager trên chế độ xem chính của mỗi Fragment.
Graeme

1
Không nghi ngờ gì rằng điều này hiệu quả, nhưng điều này có phải là vấn đề quá phức tạp không? Tôi đã giải quyết điều này bằng cách loại bỏ NestedScrollViewvà sử dụng một LinearLayoutthay thế. Lợi ích của việc sử dụng NestedScrollViewover a LinearLayoutnếu mục đích toàn bộ là cuộn nội dung trong ViewPager? Vui long sửa cho tôi nêu tôi sai. : x Cảm ơn
Cramps

1
Cảm ơn bạn rất nhiều! Tôi đã đến lúc nhổ tóc, và WrapContentHeightViewPager của bạn hoạt động như một sự quyến rũ. Tôi nợ bạn một cái!
Mavamaarten

1
Giải pháp hoàn hảo. Cảm ơn. Nó làm việc cho tôi .. :)
Mrunal

42

Thêm android:fillViewport="true"vào của bạn NestedScrollView. giai đoạn = Stage.


3
nó giải quyết được vấn đề nhưng chiều cao của viewpager sẽ là cha phù hợp (nó chiếm toàn bộ chiều cao của trang).
Manukumar

27

Thay vì đặt ViewPager bên trong NestedScrollView, hãy làm theo cách khác.

Đặt NestedScrollView trong View con bên trong ViewPager, về bản chất là bố cục của Fragment. Cũng rất có thể bạn sẽ không cần sử dụng NestedScrollView nếu bố cục danh sách Fragment của bạn rất đơn giản.

Bố cục mẫu

Bố cục của Hoạt động:

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

Nếu bạn không cần TabLayout, bạn có thể loại bỏ LinearLayout và làm cho ViewPager trở thành độc lập. Nhưng hãy đảm bảo sử dụng app:layout_behavior="@string/appbar_scrolling_view_behavior"trong các thuộc tính ViewPager.

Bố cục của Simple Fragment:

<?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" />

Bố cục của Phân đoạn phức tạp:

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

Ứng dụng mẫu: CollapsingToolbarPoc

nhập mô tả hình ảnh ở đây


Đây là một trong những đã làm điều đó cho tôi. Cảm ơn!
rjr-apps

Này Ino, điều này có vẻ đang hoạt động nhưng khi tôi thêm một chế độ xem nữa trên đầu TabLayout, nó bị hỏng. Bạn có thể cung cấp cho một số hỗ trợ?
hushing_voice

Bạn đã cứu những ngày của tôi. :)
androidXP

20

Có cùng một vấn đề.

Khi đặt NestedScrollView xung quanh ViewPager, nó sẽ không hoạt động.

Những gì DID hoạt động mặc dù là đặt NestedScrollView bên trong bố cục của phân đoạn mà tôi đang tải bên trong 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>


Nó có hoạt động nếu nội dung là một bố cục điều phối viên với NestedScrollView khác không? Và CoordinatorLayout chính có lắng nghe các sự kiện cuộn ở đó không?
Atieh

Điều này làm việc cho tôi. Tôi thêm NestedScrollView vào mọi mục trong ViewPager của mình thay vì ViewPager. Cảm ơn.
jerogaren

Tôi có vuốtfreshlayout trong phân đoạn, theo giải pháp của bạn, tôi đặt NestedScrollview trong phân đoạn, ở trên vuốtRefreshLayout .. thì dữ liệu không được tải. Nó không hoạt động.
Palak Darji

16

bạn có thể thử như thế này, viewpager hoạt động tốt, nhưng chiều cao của viewpager là cố định.

tôi vẫn đang tìm ra giải pháp tốt hơn ..., vì vậy hãy cho tôi biết bất kỳ điểm nào có thể làm tốt hơn, cảm ơn

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

Bạn đã cố gắng đóng gói nó vào một "android.support.design.widget.CoordinatorLayout" và một thanh công cụ thu gọn?
Kyso84

Các giải pháp của bạn dường như chứng minh được vấn đề là ở chiều cao. Tìm thấy bất kỳ cải tiến nào @Paul?
jasxir

3
Điều này làm việc cho tôi, nhưng tôi cũng phải gọi setFillViewport (true) trên chế độ xem lồng nhau.
larrytech 20/02/16

12

Tôi đã gặp vấn đề tương tự và chỉ sửa nó với một số thay đổi. ViewPagerkhông hoạt động trong NestedScrollView. Đơn giản chỉ cần đặt bạn ViewPagerlà con trực tiếp của bạn CoordinatorLayout. Sau đó, nội dung cho từng Phân đoạn của ViewPager phải được bao gồm trong NestedScrollView. Đó là nó.


ngay cả khi nội dung là một bố cục điều phối viên với NestedScrollView khác?
Atieh

1
Dữ liệu danh sách phân mảnh không được tải theo cách này!
Palak Darji

5

Bạn không cần sử dụng NestedScrollView để có hiệu ứng thị sai. thử một cái gì đó như thế này:

<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
Điều này sẽ hoạt động, miễn là tất cả các ViewPagermảnh vỡ của bạn là ether RecyclerView, hoặc NestedScrollView. Nếu họ không (ví dụ ListView), sau đó là một cách giải quyết cho Lollipop và ở trên là để gọilistView.setNestedScrollingEnabled(true)
AndyDeveloper

cuối cùng là một thứ hoạt động mà không cần thêm một vùng chứa cuộn bổ sung! Btw bạn cũng có thể đặt setNestedScrollingEnabled (true) này trong xml: android: nestedScrollingEnabled = "true"
Analizer

1
Nếu tôi chạy ứng dụng của mình, hãy thu gọn thanh công cụ trong khi ở một tab, chuyển đổi tab, sau đó kéo thanh công cụ xuống, thanh công cụ trống. Phải chuyển đổi các tab trong khi nó ở trạng thái không thu gọn để khôi phục lại. Rất gần, nhưng cho đến nay :(
tôi--

4

Tôi đã có một bố cục với thanh công cụ ứng dụng với NestedScrollView bên dưới nó, khi đó bên trong thanh công cụ lồng nhau là một LinearLayout, bên dưới LinearLayout là một máy nhắn tin xem. Ý tưởng là LinearLayout bên trong NestedScrollView đã được sửa - bạn có thể trượt sang trái / phải giữa các chế độ xem của chế độ xem nhưng nội dung này sẽ không di chuyển theo chiều ngang . Bạn vẫn có thể cuộn tất cả nội dung theo chiều dọc vì chế độ xem cuộn lồng nhau. Đó là ý tưởng. Vì vậy, tôi đặt chiều cao NestedScrollView lồng nhau thành match_parent, điền vào khung nhìn, sau đó tất cả các bố cục con / ViewPager thành wrap_content.

Trong đầu tôi điều đó đúng. Nhưng nó không hoạt động - ViewPager cho phép tôi di chuyển sang trái / phải, nhưng không có cuộn dọc, cho dù nội dung trang viewpager có được đẩy xuống dưới cuối màn hình hiện tại hay không. Hóa ra về cơ bản là do ViewPager không tôn trọng wrap_content trên các trang khác nhau của nó.

Tôi đã giải quyết vấn đề này bằng cách phân lớp con ViewPager để làm cho nó thay đổi chiều cao tùy thuộc vào mục được chọn hiện tại, loại buộc nó hoạt động như 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);
    }
}

Giải pháp được lấy cảm hứng từ câu trả lời này . Đã làm cho tôi!


nhưng chế độ xem cuộn tự động cuộn lên đầu? làm thế nào để khắc phục điều này?
Vivek Kumar

4

chỉ cần đặt dòng này trong NestedScrollView

android:fillViewport="true"

Rất cảm ơn. Phải làm gì nếu tôi muốn cuộn bằng cách chạm trực tiếp vào CollapsingToolbarLayout?
Pratik Saluja

3

Tôi đã xóa NestedScrollView khỏi bố cục chính và chèn làm Cha mẹ trong tất cả Fragment bố trí được cho là tải trong ViewPager cố định vấn đề này đối với tôi.


3

Sử dụng lớp tùy chỉnh bên dưới để giải quyết vấn đề của bạn. Đừng quên gọi phương thức onRefresh () trên trangechangelistener.

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

Tôi đang gặp sự cố tương tự (nhưng không có CollapsingToolbarLayout, chỉ là Toolbar+ đơn giản TabLayouttrong AppBarLayout). Tôi muốn Thanh công cụ cuộn ra khỏi tầm nhìn khi cuộn xuống nội dung của a ViewPagertrong NestedScrollView.

Bố cục của tôi giống như sau:

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

Bố cục này không hoạt động như dự định, nhưng tôi đã giải quyết nó bằng cách loại bỏ NestedScrollViewvà sử dụng một LinearLayoutthay thế. Nó hoạt động ngay với tôi trên Thư viện hỗ trợ Android v23.1.0. Đây là cách bố cục kết thúc:

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

Tái bút: Đây thực sự là hai tệp bố cục trong dự án của tôi. Tôi đã sao chép và dán chúng ở đây và cố gắng cấu trúc chúng giống như trong một tệp duy nhất. Tôi xin lỗi nếu tôi gặp trục trặc trong khi sao chép, nhưng vui lòng cho tôi biết nếu đúng như vậy để tôi có thể khắc phục.


1

Điều sau đây sẽ đảm bảo chiều cao thích hợp của máy nhắn tin xem. Phân mảnh là phân mảnh đầu tiên được cung cấp bởi máy xem trang.

<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

Ta cùng ước nguyện, tổ a ViewPagerbên trong a NestedScrollView. Nhưng nó cũng không hiệu quả với tôi. Trong trường hợp của tôi, ViewPagerbên trong mộtFragment nội dung để tôi có thể chuyển đổi nội dung tùy thuộc vào các tương tác với ngăn kéo. Tất nhiên, AppBar, thu gọn, v.v. và tất cả các tính năng mới của thư viện hỗ trợ phải hoạt động.

Nếu người dùng cuộn theo chiều dọc một trang trong máy nhắn tin, tôi muốn các trang khác được cuộn giống nhau, để tạo cho người dùng ấn tượng tổng thể rằng máy nhắn tin đã cuộn.

Những gì tôi đã làm, hiệu quả, là tôi không còn nhúng ViewPagerbên trong a nữa NestedScrollView, thay vào đó, tôi nhúng nội dung của các đoạn chứa bên trong a NestedScrollView.

Sau đó, trong trường hợp cuộn trong một đoạn, tôi thông báo cho vùng chứa về vị trí cuộn mới, nơi lưu trữ nó.

Cuối cùng, trên một lần vuốt sang trái hoặc phải được phát hiện từ máy nhắn tin (sử dụng addOnPageChangeListenertìm kiếm trạng thái kéo), tôi thông báo cho phân đoạn bên trái hoặc bên phải mục tiêu nơi nó phải cuộn (dựa trên kiến ​​thức về vùng chứa về nó) để được căn chỉnh từ phân đoạn mà tôi đến.


Vì vậy, về cơ bản bạn đã viết triển khai ViewPager của riêng mình? Bạn có thể chia sẻ mã về điều này không?
joseph

Tôi đã làm một việc tương tự như thế này (nếu tôi hiểu chính xác), đó là thực hiện một bố cục tuyến tính trong bố cục bộ điều phối của bạn, trong đó chứa tablayout (nếu cần) và khung xem, thay vì một chế độ xem cuộn lồng nhau. Sau đó, bản thân các phân đoạn có chế độ xem cuộn lồng nhau làm phần tử gốc của chúng. Điều này phù hợp với tôi, nhưng tôi thích chỉ có một chế độ xem lồng nhau thay vì lặp lại nó trong từng đoạn.
Chris

0

Tôi biết một giải pháp hữu hiệu: Bạn sử dụng Activity, với CoordinatorLayout và sử dụng FrameLayout, container. Sau đó. sử dụng trình quản lý phân mảnh để đưa phân mảnh vào vùng chứa. Ví dụ mã của tôi:

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

Và Fragment:

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

Sau đó sử dụng FragmentManager

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

Tôi nghĩ rằng LinearLayoutbố cục bên trong Fragment là không cần thiết ở đây. Xem câu trả lời của tôi, tôi đã sử dụng a LinearLayoutthay vì a FrameLayouttrong bố cục Hoạt động của mình và gốc của phân đoạn của tôi là ViewPager (không có bố cục gói).
Chuột rút

0

Sau khi dành hàng giờ để thử tất cả các đề xuất ở trên, cuối cùng tôi đã làm cho nó hoạt động. Điều quan trọng là đặt NestedScrollViewbên trong PageViewer, và thiết lập layout_behaviorđể '@string/appbar_scrolling_view_behavior'cho cả hai quan điểm. Bố cục cuối cùng giống như

<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

bạn vừa xóa NestedScrollView trên xml và thêm mã này vào lớp của bạn

yourGridView.setNestedScrollingEnabled(true);


0

Trên thực tế, NestedScrollView không cần phải là anh em trực tiếp của CollapsingToolbarLayout trong CoordinatorLayout. Tôi đã đạt được một cái gì đó thực sự bizzare. Appbar_scrolling_view_behavior hoạt động trong 2 đoạn lồng nhau.

Bố cục hoạt động của tôi:

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

Trong frameLayout "container", tôi đã thổi phồng phân đoạn này:

<android.support.constraint.ConstraintLayout>

    ... some content ...

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

    ...

</android.support.constraint.ConstraintLayout>

Và các đoạn bên trong ViewPager đó trông như thế này:

<RelativeLayout>

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

    ....

</RelativeLayout>

Thực tế là NestedScrollView có thể nằm sâu trong hệ thống phân cấp dành cho trẻ em CoordinatorLayout và các hành vi cuộn hoạt động đã làm tôi ngạc nhiên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.