ViewPager dans un NestedScrollView
J'ai besoin de créer une interface comme Google Kiosque qui est une sorte de ViewPager (défilement horizontal) sur l'effondrement de l'en-tête (défilement vertical). Un de mes exigences consiste à utiliser la nouvelle Conception de la Bibliothèque de prise en charge présentées lors de la Google IO 2015.
(http://android-developers.blogspot.ca/2015/05/android-design-support-library.html)
Basé sur l'échantillon créé par Chris Banes (https://github.com/chrisbanes/cheesesquare) j'ai atteint le point que je suis capable de faire l'effondrement de comportement, mais avec une base LinearLayout (sans défilement horizontal).
J'ai essayé de remplacer le LinearLayout par un ViewPager et j'ai eu un écran vide. J'ai joué avec: la largeur, du poids et de tous type de vue des groupes, mais.... encore un écran vide. Il semble que ViewPager et NestedScrollView n'aiment pas les uns les autres.
J'ai essayé une solution de contournement en utilisant un HorizontalScrollView: il fonctionne mais je perds le bénéfice de la PagerTitleStrip fonctionnalité et de se concentrer sur un seul panneau (je peux arrêter le horizontalement entre les 2 panneaux).
Maintenant je n'ai plus d'idées, si quelqu'un peut me conduire à une solution...
Grâce
Voici mon dernier fichier de mise en page :
<?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>
- Avez-vous essayé d'emballage de votre
ViewPager
à l'intérieur d'unLinearLayout
? Juste curieux de savoir si cela aurait rendu leViewPager
correctement. - Oui j'ai essayé mais toujours le même résultat. J'ai fait beaucoup de tests avec plusieurs composants, mais la ViewPager est jamais rendu dans la NestedScrollView peu importe la hiérarchie
- Je viens de créer une application de test avec un
ViewPager
à l'intérieur d'unNestedScrollView
comme la seule des maquettes, semblait aller bien. J'ai aussi été en mesure de tomber dans unDrawerLayout
avec succès. Peut-être il ya un autre aspect de votre code de prévenir les fonctionnalités que vous souhaitez. Soins de partager plus de votre source? - Wow, vous êtes en mesure de balayez vers la gauche/droite et haut/bas ? J'utilise simplement un FragmentPagerAdapter pour afficher des fragments dans mon téléavertisseur. Pouvez-vous partager votre exemple de code à la place ?
- J'ai collé un exemple simple de mise en page ici: pastebin.com/jXPw6mtf Edit: Vous pouvez charger quelle que soit la fragment que vous voulez dans la
ViewPager
. Je suis capable de faire défiler les points de vue haut et en bas, ainsi que de faire défiler laViewPager
gauche/droite. - Ok j'ai vu ton code merci pour le partage. J'ai 2 autres questions: 1 - Êtes-vous capable de mettre un CoordinatorLayout en tant que root vue ? 2 - Quel type de contenu que Vous avez dans votre ViewPager ? fragements ?
- Laissez-nous continuer cette discussion dans le chat.
- un peu de chance @Kyso84?
Vous devez vous connecter pour publier un commentaire.
Je rencontre ce problème ,je le résoudre par
setFillViewport (true)
de l'activité
android:fillViewport="true"
à laNestedScrollView
objet. Le documentation décrit cet attribut commeDefines whether the scrollview should stretch its content to fill the viewport.
.android:fillViewport="true"
surNestedScrollView
et à l'intérieur de lafragment
j'ai unlistView
où je me suis assisandroid:nestedScrollingEnabled="true"
.. correction du problème de défilementBon, j'ai fait une petite démo avec le
ViewPager
etNestedScrollView
. Le problème que j'ai été confronté a été à la hauteur deViewPager
et laListView
. J'ai donc fait une petite modification surListView
etViewPager's
de mesure de hauteur.Si quelqu'un souhaite le voir dans le code, Voici le lien: https://github.com/TheLittleNaruto/SupportDesignExample/
De sortie:
NestedScrollView
et à l'aide d'unLinearLayout
à la place. Quels seraient les avantages d'avoir unNestedScrollView
sur uneLinearLayout
si le but est de faire défiler le contenu dans le ViewPager? S'il vous plaît corrigez-moi si je me trompe. 😡 MerciAjouter
android:fillViewport="true"
dans votreNestedScrollView
. période.Eu les mêmes problèmes.
Lors de la mise de la NestedScrollView autour de la ViewPager, ça ne marcherait pas.
Ce N'travail même si, est de mettre le NestedScrollView à l'intérieur de la mise en page du fragment, je suis de chargement à l'intérieur de la ViewPager.
Au lieu de placer ViewPager à l'intérieur de la NestedScrollView, le faire dans l'autre sens.
Lieu le NestedScrollView dans les Vues enfant à l'intérieur de la ViewPager qui dans son essence est le Fragment de la mise en page. Il est également très probable que vous n'aurez même pas besoin d'utiliser NestedScrollView si votre Fragment de la liste mise en page est très simple.
Exemple Les Mises En
De l'activité Mise en page:
Si vous n'avez pas besoin de la TabLayout, vous pouvez abandonner le LinearLayout et faire ViewPager autonome. Mais assurez-vous d'utiliser
app:layout_behavior="@string/appbar_scrolling_view_behavior"
dans ViewPager attributs.Simple Fragment de la Mise en page:
Complexe Fragment de la Mise en page:
Exemple D'Application: CollapsingToolbarPoc
vous pouvez essayer comme ça, viewpager fonctionne très bien, mais le viewpager sa hauteur est fixe.
je suis toujours à trouver la meilleure solution ..., donc s'il vous plaît laissez-moi savoir à tout moment peut faire mieux, merci
J'ai eu le même problème, et juste il fixe avec quelques modifications.
ViewPager
ne fonctionne pas à l'intérieur de laNestedScrollView
. Suffit de mettre votreViewPager
comme un enfant direct de votreCoordinatorLayout
. Puis le de contenu pour chaque ViewPager du Fragment doit être placée dansNestedScrollView
. C'est tout.Vous n'avez pas besoin d'utiliser le NestedScrollView d'avoir les effets de parallax.
essayez quelque chose comme ceci:
ViewPager
fragments d'étherRecyclerView
, ouNestedScrollView
. Si ils ne le sont pas (par exempleListView
), puis une solution de contournement pour la Sucette et ci-dessus est d'appelerlistView.setNestedScrollingEnabled(true)
J'ai enlevé NestedScrollView à partir de la page principale et inséré comme un Parent dans tous mes Fragment les dispositions qui étaient censés charge dans ViewPager résolu ce problème pour moi.
J'ai eu une mise en page avec une application de la barre d'outils avec NestedScrollView ci-dessous, puis imbriquée à l'intérieur de la barre d'outils a été un LinearLayout, ci-dessous le LinearLayout est une vue de radiomessagerie. L'idée a été le LinearLayout à l'intérieur de la NestedScrollView a été fixé - vous pu faites glisser vers la gauche/droite entre le point de vue de la vue de radiomessagerie, mais ce contenu ne pouvait pas bouger, horizontalement au moins. Vous devriez toujours être en mesure de faire défiler tout le contenu verticalement en raison de la imbriquée de défilement de la vue. C'était l'idée. J'ai donc mis en imbriquée NestedScrollView hauteur de match_parent, remplissez la fenêtre d'affichage, puis tous les enfants layouts/ViewPager à wrap_content.
Dans ma tête qui était de droite. Mais il ne fonctionne pas - ViewPager m'a permis d'aller à gauche/droite, mais pas de défilement vertical, si le viewpager contenu de la page a poussé en dessous de la partie inférieure de l'écran ou pas. Il s'avère que c'est fondamentalement parce que la ViewPager de ne pas respecter le wrap_content à travers ses différentes pages.
J'ai eu autour de ce sous-classement par le ViewPager pour faire changer la hauteur en fonction de l'élément sélectionné, sorte de le forcer à se comporter comme des layout_height="wrap_content":
Solution a été inspiré par cette réponse. A fonctionné pour moi!
Utilisation ci-dessous un cours sur mesure pour résoudre votre problème. N'oubliez pas d'appeler onRefresh() la méthode sur pagechangelistener.
Les éléments suivants doivent veiller à la bonne hauteur de la vue pager. Le fragment est le premier fragment fournies par le point de vue de radiomessagerie.
J'ai eu un problème similaire (mais sans
CollapsingToolbarLayout
, juste un simpleToolbar
+TabLayout
dans leAppBarLayout
). Je voulais la Barre d'outils pour faire défiler hors de vue lorsque le défilement vers le bas le contenu d'unViewPager
dans leNestedScrollView
.Ma mise en page est allé quelque chose comme ceci:
Cette mise en page ne fonctionnait pas comme prévu, mais je l'ai résolu en simplement se débarrasser de la
NestedScrollView
et à l'aide d'unLinearLayout
à la place. Il a travaillé pour moi tout de suite sur Android Support Library v23.1.0. Voici comment faire la mise en page est terminé:PS: ce sont en fait deux fichiers de mise en page dans mon projet. J'ai copié et collé ici et essayé de structurer comme il pourrait ressembler dans un seul fichier. Je suis désolé si j'ai foiré alors que copier-coller, mais s'il vous plaît laissez-moi savoir si c'est le cas alors je peux le résoudre.
J'ai le même souhait, nest un
ViewPager
à l'intérieur d'unNestedScrollView
. Mais il ne fonctionne pas pour moi non plus. Dans mon cas, leViewPager
est à l'intérieur d'unFragment
de sorte que je peux changer le contenu en fonction des interactions avec le tiroir. Bien sûr, la barre d'application, de l'effondrement, etc et toutes les nouvelles fonctionnalité de la bibliothèque de prise en charge doit travailler.Si un utilisateur verticalement fait défiler une page dans le pager, je veux d'autres pages à faire défiler les mêmes, pour donner à l'utilisateur l'impression d'ensemble que le pager se défiler.
Ce que j'ai fait, ce qui fonctionne, c'est que je n'ai plus intégrer la
ViewPager
à l'intérieur d'unNestedScrollView
, au lieu de cela, je incorporer le contenu de la contenait des fragments à l'intérieur d'unNestedScrollView
.Puis, en cas de défilement dans un fragment, j'informe le conteneur de la nouvelle position de défilement, qui les stocke.
Enfin, sur un balayez vers la gauche ou la droite l'a détecté le pager (à l'aide de
addOnPageChangeListener
la recherche de glisser-unis) - je informer la cible de gauche ou de droite fragment où il doit faire défiler (basée sur le conteneur de la connaissance de celui-ci) pour être aligné à partir du fragment je viens d'.Je connais une solution de travail: Vous utilisez de l'Activité, avec CoordinatorLayout et l'utilisation FrameLayout, conteneur. Alors. utilisation fragment manager pour mettre fragment de récipient. Par exemple mon code:
Et De Fragment:
Ensuite utiliser FragmentManager
LinearLayout
dans le Fragment de la mise en page est inutile ici. Voir ma réponse, j'ai utilisé unLinearLayout
au lieu d'unFrameLayout
dans mon Activité de mise en page, et mon fragment de racine est un ViewPager (aucun emballage de mise en page).Après avoir passé des heures essayé toutes les suggestions ci-dessus, enfin je l'ai fait travailler. La clé est de mettre
NestedScrollView
à l'intérieur dePageViewer
, ET de définirlayout_behavior
à'@string/appbar_scrolling_view_behavior'
pour les DEUX points de vue. La mise en page finale est commevous venez de supprimer la NestedScrollView sur votre xml et ajouter ce code sur votre classe
yourGridView.setNestedScrollingEnabled(true);
Fait le NestedScrollView n'a pas besoin d'être direct, frère de CollapsingToolbarLayout dans CoordinatorLayout. J'ai réalisé quelque chose de vraiment bizarre. Le appbar_scrolling_view_behavior fonctionne dans les 2 imbriquée fragments.
Mon activité mise en page:
Dans le "conteneur" frameLayout j'ai gonflé ce fragment:
Et les fragments à l'intérieur que ViewPager ressemble à ceci:
Fait que NestedScrollView peut être si profondément dans la CoordinatorLayout les enfants de la hiérarchie et de défilement des comportements stil travail n'a surpris moi.
viens de mettre cette ligne dans NestedScrollView