Ich muss eine Oberfläche wie Google Newsstand erstellen, die eine Art ViewPager (horizontaler Bildlauf) über einem reduzierenden Header (vertikaler Bildlauf) ist. Eine meiner Anforderungen ist die Verwendung der neuen Design Support Library, die auf der Google IO 2015 vorgestellt wird. ( Http://android-developers.blogspot.ca/2015/05/android-design-support-library.html )
Basierend auf dem von Chris Banes erstellten Beispiel ( https://github.com/chrisbanes/cheesesquare ) habe ich den Punkt erreicht, an dem ich das Reduktionsverhalten ausführen kann, jedoch mit einem einfachen LinearLayout (ohne horizontalen Bildlauf).
Ich habe versucht, das LinearLayout durch einen ViewPager zu ersetzen, und habe einen leeren Bildschirm erhalten. Ich habe gespielt mit: Breite, Gewicht und allen Arten von Ansichtsgruppen, aber ... immer noch ein leerer Bildschirm. Es scheint, dass ViewPager und NestedScrollView sich nicht mögen.
Ich habe versucht, eine Problemumgehung mithilfe eines HorizontalScrollView zu verwenden: Es funktioniert, aber ich verliere den Vorteil der PagerTitleStrip-Funktion und den Fokus auf ein einzelnes Bedienfeld (ich kann das horizontale zwischen zwei Bedienfeldern stoppen).
Jetzt habe ich keine Ideen mehr, ob mich jemand zu einer Lösung führen kann ...
Vielen Dank
Hier ist meine neueste Layoutdatei:
<?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
in ein zu wickelnLinearLayout
? Nur neugierig, ob das dasViewPager
richtig machen würde .ViewPager
Inside-ANestedScrollView
als einzigem Layout erstellt - schien gut zu funktionieren. Ich konnte auchDrawerLayout
erfolgreich in eine fallen . Vielleicht gibt es einen anderen Aspekt Ihres Codes, der die gewünschte Funktionalität verhindert. Möchten Sie mehr von Ihrer Quelle teilen?ViewPager
. Ich kann die Ansichten nach oben und unten sowie nachViewPager
links / rechts scrollen .Antworten:
Ich treffe dieses Problem, ich löse es durch
setFillViewport (true)
in der Aktivität
quelle
android:fillViewport="true"
demNestedScrollView
Objekt hinzu. In der Dokumentation wird dieses Attribut als beschriebenDefines whether the scrollview should stretch its content to fill the viewport.
.android:fillViewport="true"
aufNestedScrollView
und in derfragment
ichlistView
saß, wo ich saßandroid:nestedScrollingEnabled="true"
. Das Bildlaufproblem wurdeOkay, ich habe eine kleine Demo mit dem
ViewPager
und gemachtNestedScrollView
. Das Problem, mit dem ich konfrontiert war, war die HöheViewPager
und dieListView
. Also habe ich eine kleine Änderung anListView
undViewPager's
Höhenmessung vorgenommen.Wenn jemand in den Code schauen möchte, ist hier der Link: https://github.com/TheLittleNaruto/SupportDesignExample/
Ausgabe:
quelle
NestedScrollView
und stattdessen einLinearLayout
verwendet habe. Was wären die Vorteile einesNestedScrollView
Over a,LinearLayout
wenn der gesamte Zweck darin besteht, den Inhalt im ViewPager zu scrollen? Bitte korrigieren Sie mich, wenn ich falsch liege. : x DankeFügen Sie
android:fillViewport="true"
in IhremNestedScrollView
. Zeitraum.quelle
Anstatt ViewPager in NestedScrollView zu platzieren, machen Sie es umgekehrt.
Platzieren Sie die NestedScrollView in den untergeordneten Ansichten im ViewPager, der im Wesentlichen das Layout des Fragments darstellt. Es ist auch sehr wahrscheinlich, dass Sie NestedScrollView nicht einmal verwenden müssen, wenn das Listenlayout Ihres Fragments sehr einfach ist.
Beispiellayouts
Layout der Aktivität:
Wenn Sie das TabLayout nicht benötigen, können Sie das LinearLayout fallen lassen und ViewPager eigenständig machen. Aber seien Sie sicher, zu verwenden
app:layout_behavior="@string/appbar_scrolling_view_behavior"
unbedingt die ViewPager-Attribute.Layout des einfachen Fragments:
Layout des komplexen Fragments:
Beispiel-App: CollapsingToolbarPoc
quelle
Hatte die gleichen Probleme.
Wenn Sie NestedScrollView um den ViewPager legen, funktioniert dies nicht.
Was jedoch funktioniert hat, ist, die NestedScrollView in das Layout des Fragments einzufügen, das ich in den ViewPager lade.
quelle
Sie können es so versuchen, Viewpager funktioniert einwandfrei, aber die Höhe des Viewpagers ist festgelegt.
Ich finde immer noch die bessere Lösung ..., also lassen Sie mich bitte wissen, dass jeder Punkt es besser machen kann, danke
quelle
Ich hatte das gleiche Problem und habe es nur mit einigen Änderungen behoben.
ViewPager
funktioniert nicht innerhalb derNestedScrollView
. Setzen Sie einfachViewPager
als direktes Kind von IhnenCoordinatorLayout
. Dann sollte der Inhalt für jedes ViewPager-Fragment eingeschlossen seinNestedScrollView
. Das ist es.quelle
Sie müssen NestedScrollView nicht verwenden, um die Parallaxeeffekte zu erzielen. versuchen Sie so etwas:
quelle
ViewPager
Fragmente Äther sindRecyclerView
, oderNestedScrollView
. Wenn dies nicht derListView
listView.setNestedScrollingEnabled(true)
Ich hatte ein Layout mit einer App-Symbolleiste mit NestedScrollView darunter, dann befand sich in der verschachtelten Symbolleiste ein LinearLayout, unter dem LinearLayout ein Ansichtspager. Die Idee war, dass das LinearLayout in der NestedScrollView behoben wurde - Sie konnten zwischen den Ansichten des Ansichtspagers nach links / rechts schieben, aber dieser Inhalt bewegte sich zumindest horizontal nicht . Aufgrund der verschachtelten Bildlaufansicht sollten Sie weiterhin in der Lage sein, den gesamten Inhalt vertikal zu scrollen. Das war die Idee. Also habe ich die verschachtelte NestedScrollView-Höhe auf match_parent gesetzt, das Ansichtsfenster gefüllt und dann alle untergeordneten Layouts / ViewPager auf wrap_content gesetzt.
In meinem Kopf war das richtig. Aber es hat nicht funktioniert - ViewPager erlaubte mir, nach links / rechts zu gehen, aber kein vertikales Scrollen, unabhängig davon, ob der Inhalt der Viewpager-Seite unter den unteren Rand des aktuellen Bildschirms verschoben wurde oder nicht. Es stellte sich heraus, dass dies im Grunde darauf zurückzuführen ist, dass der ViewPager wrap_content auf seinen verschiedenen Seiten nicht berücksichtigt.
Ich habe dies umgangen, indem ich den ViewPager in Unterklassen unterteilt habe, damit er die Höhe abhängig vom aktuell ausgewählten Element ändert, und ihn dazu gezwungen hat, sich wie layout_height = "wrap_content" zu verhalten:
Die Lösung wurde von dieser Antwort inspiriert . Hat für mich gearbeitet!
quelle
Fügen Sie diese Zeile einfach in NestedScrollView ein
quelle
Ich entfernte NestedScrollView vom Haupt Layout und als eingefügt Elternteil in all meinem Fragment - Layout , die in zu laden sollten ViewPager für mich , dieses Problem behoben.
quelle
Verwenden Sie die unten angepasste Klasse, um Ihr Problem zu beheben. Vergessen Sie nicht, die onRefresh () -Methode auf pagechangelistener aufzurufen.
quelle
Ich hatte ein ähnliches Problem (aber ohne
CollapsingToolbarLayout
, nur ein einfachesToolbar
+TabLayout
innerhalb derAppBarLayout
). Ich wollte, dass die Symbolleiste außer Sichtweite rollt, wenn der Inhalt von aViewPager
innerhalb derNestedScrollView
.Mein Layout sah ungefähr so aus:
Dieses Layout funktionierte nicht wie beabsichtigt, aber ich löste es, indem ich es einfach loswurde
NestedScrollView
und stattdessen einLinearLayout
verwendete. Es funktionierte sofort für mich in der Android Support Library v23.1.0. So endete das Layout:PS: Das waren eigentlich zwei Layoutdateien in meinem Projekt. Ich habe sie hier kopiert und eingefügt und versucht, sie so zu strukturieren, wie es in einer einzelnen Datei aussehen würde. Es tut mir leid, wenn ich beim Einfügen Fehler gemacht habe, aber bitte lassen Sie mich wissen, ob dies der Fall ist, damit ich das Problem beheben kann.
quelle
Das Folgende sollte die richtige Höhe des Ansichtspagers sicherstellen. Das Fragment ist das erste Fragment, das vom Ansichtspager bereitgestellt wird.
quelle
Ich habe den gleichen Wunsch, ein
ViewPager
in a zu nistenNestedScrollView
. Aber es funktioniert auch nicht bei mir. In meinem Fall ist dasViewPager
in einemFragment
sodass ich den Inhalt abhängig von den Interaktionen mit der Schublade wechseln kann. Natürlich müssen AppBar, Collapse usw. und alle neuen Funktionen der Support-Bibliothek funktionieren.Wenn ein Benutzer eine Seite im Pager vertikal scrollt, möchte ich, dass andere Seiten gleich gescrollt werden, um dem Benutzer den Gesamteindruck zu vermitteln, dass der Pager selbst gescrollt hat.
Was ich getan habe, was funktioniert, ist, dass ich nicht mehr das
ViewPager
Innere a einbetteNestedScrollView
, sondern den Inhalt der enthaltenen Fragmente in a einbetteNestedScrollView
.Im Falle einer Schriftrolle in einem Fragment informiere ich den Container dann über die neue Bildlaufposition, in der sie gespeichert ist.
Schließlich
addOnPageChangeListener
informiere ich das linke oder rechte Zielfragment über einen vom Pager erkannten Wisch nach links oder rechts (unter Verwendung der Suche nach Ziehzuständen), wo es scrollen muss (basierend auf dem Containerwissen darüber), um von dem Fragment ausgerichtet zu werden, von dem ich komme.quelle
Ich kenne eine funktionierende Lösung: Sie verwenden Activity mit CoordinatorLayout und FrameLayout, Container. Dann. Verwenden Sie den Fragment-Manager, um das Fragment in den Container zu legen. Zum Beispiel mein Code:
Und Fragment:
Verwenden Sie dann FragmentManager
quelle
LinearLayout
Layout innerhalb des Fragments ist hier nicht notwendig. Siehe meine Antwort, ich habe im Layout meiner Aktivität einLinearLayout
anstelle von a verwendetFrameLayout
, und das Stammverzeichnis meines Fragments ist ein ViewPager (kein Wrapping-Layout).Nachdem ich stundenlang alle oben genannten Vorschläge ausprobiert hatte, ließ ich es endlich funktionieren. Der Schlüssel setzt
NestedScrollView
innenPageViewer
, und legen Sielayout_behavior
auf'@string/appbar_scrolling_view_behavior'
für BEIDE Ansichten. Das endgültige Layout ist wiequelle
Sie haben gerade die NestedScrollView in Ihrer XML entfernt und diesen Code in Ihre Klasse eingefügt
yourGridView.setNestedScrollingEnabled(true);
quelle
Tatsächlich muss NestedScrollView kein direktes Geschwister von CollapsingToolbarLayout in CoordinatorLayout sein. Ich habe etwas wirklich Bizzares erreicht. Das appbar_scrolling_view_behavior arbeitet in 2 verschachtelten Fragmenten.
Mein Aktivitätslayout:
Im "Container" FrameLayout habe ich dieses Fragment aufgeblasen:
Und Fragmente in diesem ViewPager sehen folgendermaßen aus:
Die Tatsache, dass NestedScrollView so tief in der CoordinatorLayout-Kinderhierarchie und im Bildlaufverhalten stecken kann, hat mich überrascht.
quelle