NestedScrollView içinde ViewPager


111

Google Gazetelik gibi, daralan bir başlık üzerinde (dikey kaydırma) bir tür ViewPager (yatay kaydırma) olan bir arayüz oluşturmam gerekiyor. Gereksinimlerimden biri, Google IO 2015'te sunulan yeni Tasarım Destek Kitaplığı'nı kullanmaktır. ( Http://android-developers.blogspot.ca/2015/05/android-design-support-library.html )

Chris Banes ( https://github.com/chrisbanes/cheesesquare ) tarafından oluşturulan örneğe dayanarak , çökme davranışını temel bir LinearLayout ile (yatay kaydırma olmadan) yapabileceğim noktaya ulaştım.

LinearLayout'u bir ViewPager ile değiştirmeyi denedim ve boş bir ekranım var. Oynadım: genişlik, ağırlık ve her türlü görüş grubu ama .... hala boş bir ekran. Görünüşe göre ViewPager ve NestedScrollView birbirlerinden hoşlanmıyor.

HorizontalScrollView kullanarak bir geçici çözüm denedim: işe yarıyor ancak PagerTitleStrip özelliğinin ve tek bir panele odaklanmanın avantajını kaybediyorum (2 panel arasında yatay olarak durabilirim).

Şimdi başka fikrim yok, eğer biri beni çözüme götürebilirse ...

Teşekkürler

İşte en son düzen dosyam:

<?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İçini sarmayı denedin LinearLayoutmi? Bunun ViewPagerdüzgün bir şekilde işleyip işlemeyeceğini merak ediyorum .
CzarMatt 01

Evet denedim ama yine de aynı sonuç. Birçok bileşenle birçok test yaptım, ancak ViewPager hiyerarşi ne olursa olsun hiçbir zaman bir NestedScrollView'da işlenmiyor
Kyso84

Sadece düzen olarak a ViewPageriçi a içeren bir test uygulaması oluşturdum NestedScrollView- iyi çalışıyor gibiydi. Ben de DrawerLayoutbaşarılı bir şekilde düşebildim. Belki de kodunuzun istediğiniz işlevselliği engelleyen başka bir yönü vardır. Kaynağınızdan daha fazlasını paylaşmak ister misiniz?
CzarMatt 01

Vay canına, böylece sola / sağa ve yukarı / aşağı kaydırabiliyor musunuz? Çağrı cihazımda parçaları görüntülemek için bir FragmentPagerAdapter kullanıyorum. Bunun yerine örnek kodunuzu paylaşabilir misiniz?
Kyso84

Burada basit bir örnek düzenini yapıştırılan: pastebin.com/jXPw6mtf Edit: Daha istediğimi parçası yükleyebilirsiniz ViewPager. Görünümleri yukarı ve aşağı kaydırabiliyorum, ayrıca ViewPagersola / sağa kaydırabiliyorum .
CzarMatt 01

Yanıtlar:


128

Bu problemle karşılaşıyorum, çözüyorum 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"/>

aktivitede

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

görüntü açıklamasını buraya girin


31
Not Bu hem XML ayarlanabilir olduğu, sadece eklemek android:fillViewport="true"için NestedScrollViewnesne. Dokümantasyon olarak bu niteliği açıklanır Defines whether the scrollview should stretch its content to fill the viewport..
Krøllebølle

7
Bu, yer tutucu parçalarındaki kaydırma sorununu çözmez
Atieh

3
Teşekkürler! Ben oturdum android:fillViewport="true"üzerine NestedScrollViewve içine fragmentben bir listViewben oturduğum yerden android:nestedScrollingEnabled="true".. kaydırma sorunu düzeltildi
radubogdan

@ Krøllebølle NestedScrollView bu özniteliğe sahip değil, onu programlı olarak ayarlamalısınız.

Evet bu benim için çalışıyor. Viewpager'ın yüksekliğini NestedScrollView içinde match_parent olarak ayarladığımda bir sorun yaşıyorum, görünümleri göstermiyordu.
Waheed Nazir

71

Tamam, ViewPagerve ile küçük bir demo yaptım NestedScrollView. Karşılaştığım sorun, yüksekliği ViewPagerve ListView. Bu yüzden üzerinde küçük bir değişiklik yaptım ListViewveViewPager's yükseklik ölçüm.

Herhangi biri koda bakmak isterse, İşte bağlantı: https://github.com/TheLittleNaruto/SupportDesignExample/

Çıktı:

görüntü açıklamasını buraya girin


çalışmıyor, eğer parça liste görünümüne sahip değilse, hatta öğelerin sayısı tüm parçalar için aynı ise çalışmasını forlistview bile.
Pankaj Arora

3
Ben olabilir az şey partisine geç ama, ben bu bugün çalışıyordu ve ben ekleyerek uygulaması ile çalışan (çoğunlukla) hallederim: layout_behavior = "@ string / appbar_scrolling_view_behavior" ViewPager hem ve ana görünümünde her Fragman.
Graeme

1
Bunun işe yaradığına şüphe yok, ancak bu sorunu fazla karmaşık hale getirmiyor mu? Bunu, 'den kurtulup bunun yerine NestedScrollViewa kullanarak LinearLayoutçözdüm. Bir sahip olmanın avantajları ne olurdu NestedScrollViewbir aşkın LinearLayouttüm amacı ViewPager içinde içeriğini kaydırmak için ise? Yanılıyorsam lütfen beni düzeltin. : x Teşekkürler
Kramplar

1
Çok teşekkür ederim! Saçımı çekme noktasındaydım ve WrapContentHeightViewPager'ınız bir cazibe gibi çalışıyor. Sana borçlandım!
Mavamaarten

1
Mükemmel çözüm. Teşekkürler. Benim için çalıştı .. :)
Mrunal

42

Ekle android:fillViewport="true"Sepetinde NestedScrollView. dönem.


3
sorunu çözer, ancak görüntüleyici yüksekliği, eşleşen üst öğe olacaktır (tüm sayfa yüksekliğini alır).
Manukumar

27

ViewPager'ı NestedScrollView içine yerleştirmek yerine, bunu tam tersi şekilde yapın.

NestedScrollView öğesini, özünde Fragment mizanpajı olan ViewPager içindeki alt Görünümlere yerleştirin. Ayrıca Fragment'inizin liste düzeni çok basitse, NestedScrollView'ı kullanmanıza bile gerek kalmayabilir.

Örnek Düzenler

Aktivitenin Düzeni:

<?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'a ihtiyacınız yoksa, LinearLayout'tan vazgeçebilir ve ViewPager'ı bağımsız hale getirebilirsiniz. Ancak app:layout_behavior="@string/appbar_scrolling_view_behavior"ViewPager niteliklerinde kullandığınızdan emin olun .

Basit Parçanın Düzeni:

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

Karmaşık Parçanın Düzeni:

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

Örnek Uygulama: CollapsingToolbarPoc

görüntü açıklamasını buraya girin


Bunu benim için yapan bu. Teşekkürler!
rjr-apps

Hey Ino, bu işe yarıyor gibi görünüyor ama TabLayout'un üstüne bir görünüm daha eklediğimde kırılıyor. Biraz yardım edebilir misin?
hushed_voice

Günlerimi kurtardın. :)
androidXP

20

Aynı sorunları yaşadım.

NestedScrollView etrafına yerleştirilirken ViewPager yerleştirirken işe yaramaz.

NestedScrollView’u ViewPager’ın içine yüklediğim parçanın düzeninin içine koymak .

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


İçerik başka bir NestedScrollView ile koordinatör düzeniyse çalışır mı? Üst Koordinatör Düzeni oradaki kaydırma olaylarını dinliyor mu?
Atieh

Bu benim için çalışıyor. ViewPager yerine ViewPager'ımın her öğesine NestedScrollView ekliyorum. Teşekkürler.
jerogaren

Parçada swipefreshlayout'um var, çözümünüze göre, NestedScrollview'u parçaya, swipeRefreshLayout'un üstüne koydum .. sonra veri yüklenmiyor. Çalışmadı.
Palak Darji

16

bu şekilde deneyebilirsiniz, görüntüleyici iyi çalışıyor, ancak görüntüleyicinin yüksekliği sabittir.

Hala daha iyi bir çözüm buluyorum ... bu yüzden lütfen herhangi bir noktanın daha iyi yapabileceğini bana bildirin, teşekkürler

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

Onu bir "android.support.design.widget.CoordinatorLayout" ve daralan bir araç çubuğu içine sarmaya çalıştınız mı?
Kyso84

Çözümleriniz sorunun yükseklikte olduğunu kanıtlıyor gibi görünüyor. Henüz bir gelişme buldunuz mu @ Paul?
jasxir

3
Bu benim için çalıştı, ancak iç içe görünümde setFillViewport'u (true) da çağırmak zorunda kaldım.
larrytech

12

Aynı sorunu yaşadım ve bazı değişikliklerle düzelttim. ViewPageriçinde çalışmaz NestedScrollView. Basitçe kendinizi ViewPagerdoğrudan çocuğunuzun çocuğu olarak koyun CoordinatorLayout. Daha sonra her ViewPager Parçasının içeriği içine alınmalıdır NestedScrollView. Bu kadar.


içerik başka bir NestedScrollView ile koordinatör düzeni olsa bile?
Atieh

1
Parça listesi görünümü verileri bu şekilde yüklenmiyor!
Palak Darji

5

Paralaks efektlerine sahip olmak için NestedScrollView kullanmanıza gerek yoktur. bunun gibi bir şey dene:

<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
Bu irade eser sürece tüm olarak ViewPagerfragmanları eter olan RecyclerViewveya NestedScrollView. Değilse (örn. ListView), Lollipop ve üstü için bir geçici çözüm listView.setNestedScrollingEnabled(true)
aramaktır

nihayet fazladan bir kaydırma konteyneri eklemeden çalışan bir şey! Btw bu setNestedScrollingEnabled (true) 'yu xml'de de ayarlayabilirsiniz: android: nestedScrollingEnabled = "true"
Analizer

1
Uygulamamı çalıştırırsam, bir sekmedeyken araç çubuğunu daraltır, sekmeyi değiştirir ve ardından araç çubuğunu tekrar aşağı çekersem, boş. Tekrar geri almak için daraltılmamış durumdayken sekmeleri değiştirmelisiniz. Çok yakın, ama şimdiye kadar :(
bana--

4

Altında NestedScrollView bulunan bir uygulama araç çubuğuna sahip bir düzenim vardı, ardından iç içe geçmiş araç çubuğunun içinde bir LinearLayout vardı, LinearLayout'un altında bir görünüm sayfalayıcı vardı. Fikir, NestedScrollView içindeki LinearLayout düzeltildi - görünüm sayfalayıcısının görünümleri arasında sola / sağa kaydırabilirsiniz, ancak bu içerik en azından yatay olarak hareket etmiyordu . İç içe kaydırma görünümü nedeniyle yine de tüm içeriği dikey olarak kaydırabilmeniz gerekir. Fikir buydu. Bu yüzden iç içe geçmiş NestedScrollView yüksekliğini match_parent olarak ayarladım, görünüm alanını doldurdum, ardından tüm alt düzenleri / ViewPager'ı wrap_content olarak ayarladım.

Kafamda bu doğruydu. Ancak işe yaramadı - ViewPager sola / sağa gitmeme izin verdi, ancak görüntüleyici sayfa içeriği mevcut ekranın altına itilmiş olsun veya olmasın dikey kaydırma yapmama izin verdi. Görünüşe göre temelde ViewPager çeşitli sayfalarında wrap_content'e saygı göstermiyor.

ViewPager'ı mevcut seçili öğeye bağlı olarak yüksekliğini değiştirmesi için alt sınıflara ayırarak, bunu layout_height = "wrap_content" gibi davranmaya zorlayarak aştım:

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);
    }
}

Çözüm bu cevaptan ilham aldı . Benim için çalıştı!


ancak kaydırma görünümü otomatik olarak en üste kayar? bunu nasıl düzeltebilirim?
Vivek Kumar

4

sadece bu satırı NestedScrollView’a koyun

android:fillViewport="true"

Çok teşekkürler. Doğrudan CollapsingToolbarLayout'a dokunarak kaydırmak istersem ne yapmalıyım?
Pratik Saluja

3

Ana mizanpajdan NestedScrollView öğesini kaldırdım ve ViewPager'da yüklenmesi beklenen tüm Fragment mizanpajlarıma Üst öğe olarak ekledim , bu sorunu benim için düzeltti.


3

Sorununuzu çözmek için aşağıdaki özelleştirilmiş sınıfı kullanın. Pagechangelistener'da onRefresh () yöntemini çağırmayı unutmayın.

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

Ben de benzer bir problem yaşıyordum (ama olmadan CollapsingToolbarLayout, sadece içinde basit bir Toolbar+ ). Bir içeriğini aşağı kaydırma Çubuğu gözden uzak kaydırmak istedi içinde .TabLayoutAppBarLayoutViewPagerNestedScrollView

Düzenim şuna benzer:

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

Bu düzen amaçlandığı gibi çalışmıyordu, ancak basitçe 'den kurtulup yerine NestedScrollViewa kullanarak LinearLayoutçözdüm. Android Destek Kitaplığı v23.1.0'da hemen benim için çalıştı. Düzen şu şekilde sona erdi:

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

Not: Bunlar aslında projemdeki iki düzen dosyasıydı. Buraya kopyalayıp yapıştırdım ve tek bir dosyada görünecekleri şekilde yapılandırmaya çalıştım. Kopyala yapıştırma işlemi sırasında hata yaptıysam özür dilerim, ancak sorun buysa lütfen bana bildirin, böylece düzeltebilirim.


1

Aşağıdakiler, görüntüleme çağrı cihazının uygun yüksekliğini sağlamalıdır. Parça, görüntüleme çağrı cihazı tarafından sağlanan ilk parçadır.

<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

Aynı dileği, yuva a sahip ViewPagerbir iç NestedScrollView. Ama benim için de işe yaramıyor. Benim durumumda, ViewPagerbirFragment ben çekmece etkileşimlerine bağlı olarak içerik geçiş yapabilirsiniz. Tabii ki, AppBar, daraltma vb. Ve destek kitaplığının tüm yeni özellikleri çalışmalıdır.

Bir kullanıcı sayfalayıcıdaki bir sayfayı dikey olarak kaydırırsa, kullanıcıya sayfalayıcının kendisinin kaydırdığı genel izlenimini vermek için diğer sayfaların da aynı şekilde kaydırılmasını istiyorum.

Yaptığım şey işe yarıyor, artık a'nın ViewPageriçine NestedScrollViewdeğil, içerilen parçaların içeriğini a'nın içine gömüyorum NestedScrollView.

Daha sonra, bir parçada bir kaydırma olması durumunda, kabı depolayan yeni kaydırma konumunu bilgilendiriyorum.

Son olarak, çağrı cihazından algılanan sola veya sağa bir kaydırmada ( addOnPageChangeListenersürükleme durumlarını aramayı kullanarak ), sol veya sağ parçayı, geldiğim parçadan hizalanması için (kapsayıcı bilgisine dayanarak) nereye kaydırması gerektiğini bildiriyorum.


Yani aslında kendi ViewPager uygulamanızı mı yazdınız? Bununla ilgili kodu paylaşabilir misin?
joseph

Buna benzer bir şey yaptım (eğer doğru anladıysam), koordinatör mizanpajınızda iç içe bir kaydırma görünümü yerine sekme düzenini (gerekirse) ve görüntüleyici içeren doğrusal bir düzen yapmak. Parçaların kendileri daha sonra kök öğeleri olarak iç içe kaydırma görünümüne sahiptir. Bu benim için işe yarıyor, ancak her parçada tekrarlamak yerine yalnızca bir iç içe geçmiş kaydırma görünümüne sahip olmayı tercih ederim.
Chris

0

Çalışan bir çözüm biliyorum: CoordinatorLayout ile Activity ve FrameLayout, container kullanıyorsunuz. Sonra. parçayı kaba koymak için parça yöneticisini kullanın. Örneğin benim kodum:

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

Ve Parça:

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

Ardından FragmentManager'ı kullanın

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

LinearLayoutFragment'in iç düzeninin burada gereksiz olduğunu düşünüyorum . Cevabıma bakın, Aktivitem mizanpajında a LinearLayoutyerine a kullandım FrameLayoutve parçamın kökü bir ViewPager (sarma düzeni yok).
Kramplar

0

Saatler geçirdikten sonra yukarıdaki tüm önerileri denedim, sonunda işe yaradım. Anahtar koyuyor NestedScrollViewiçini PageViewerVE seti layout_behavioriçin '@string/appbar_scrolling_view_behavior'için İKİ görünümleri. Son düzen şöyle:

<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

xml'nizdeki NestedScrollView öğesini kaldırdınız ve bu kodu sınıfınıza eklediniz

yourGridView.setNestedScrollingEnabled(true);


0

Aslında NestedScrollView, CoordinatorLayout'ta CollapsingToolbarLayout'un doğrudan kardeşi olmak zorunda değildir. Gerçekten tuhaf bir şey başardım. Appbar_scrolling_view_behavior 2 iç içe kısımda çalışır.

Etkinlik düzenim:

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

"Container" frameLayout'ta bu parçayı şişirdim:

<android.support.constraint.ConstraintLayout>

    ... some content ...

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

    ...

</android.support.constraint.ConstraintLayout>

Ve bu ViewPager içindeki parçalar şuna benzer:

<RelativeLayout>

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

    ....

</RelativeLayout>

NestedScrollView’un CoordinatorLayout çocuk hiyerarşisinde çok derin olabileceği gerçeği ve hala çalışmalar beni şaşırttı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.