2015-10-05 13 views
116

Ich habe folgendes Layout:hinzufügen Ansichten unter den Symbolleisten in CoordinatorLayout

<android.support.design.widget.CoordinatorLayout 
    android:id="@+id/main_content" 
    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:id="@+id/appBar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.ActionBar"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:layout_scrollFlags="scroll|enterAlways" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 

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

    <FrameLayout 
     android:id="@+id/content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</android.support.design.widget.CoordinatorLayout> 

ich hinzufügen Fragment s in die FrameLayout, sie zu ersetzen. Einer meiner Fragment s ist eine Liste, die folgendes Layout hat:

<android.support.v7.widget.RecyclerView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/recyclerView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

Mein Problem hier, dass die Symbolleiste über der Liste gezogen wird. Ich habe versucht, das zu lösen, indem ich den Inhalt der CoordinatorLayout in eine LinearLayout verpackte, die die Überziehung löste, aber auf diese Weise funktioniert das Appbar-Scroll-Verhalten nicht mehr.

Jede Hilfe wird sehr geschätzt!

Antwort

254

Nehmen Sie das Attribut

app:layout_behavior="@string/appbar_scrolling_view_behavior" 

vom RecyclerView und legt es auf den FrameLayout, die Sie unter den Toolbar zu zeigen versuchen.

Ich habe festgestellt, dass eine wichtige Sache das Scrollen Ansicht Verhalten ist, ist das Layout der Komponente unter der Symbolleiste. Da die FrameLayout einen Nachkommen hat, der scrollt (RecyclerView), wird die CoordinatorLayout diese Scroll-Ereignisse zum Verschieben der Toolbar erhalten.


Eine andere Sache bewusst zu sein: Das Layout Verhalten wird die FrameLayout Höhe bewirken als so bemessen sein, wenn die Toolbar bereits gescrollt wird, und mit den Toolbar vollständig der gesamten Ansicht angezeigt wird, einfach so nach unten gedrückt dass der Boden der Ansicht unter dem Boden der CoordinatorLayout ist.

Das war eine Überraschung für mich. Ich habe erwartet, dass die Ansicht dynamisch skaliert wird, wenn die Symbolleiste nach oben und unten gescrollt wird. Wenn Sie also eine Scroll-Komponente mit einer festen Komponente am unteren Rand Ihrer Ansicht haben, werden Sie diese untere Komponente erst sehen, wenn Sie die Toolbar vollständig gescrollt haben.

Also, wenn ich einen Knopf an der Unterseite des UI zu verankern wollte, habe ich um diesen durch die Schaltfläche am unteren Rande des Putting CoordinatorLayout (android:layout_gravity="bottom") und das Hinzufügen eines unteren Randes gleich die Höhe der Taste unter der Ansicht die Symbolleiste.

+1

Vielen Dank, das funktioniert wirklich! Mein einziges Problem danach, wenn die Toolbar ausgezogen wurde, kam nicht zurück, nachdem ich das Fragment "Fragment" mit einer Liste durch ein anderes "Fragment" ersetzt hatte. Ich habe es geschafft, die Werkzeugleiste [this] (http://stackoverflow.com/a/30729413/747412) manuell zu zeigen. – WonderCsabo

+0

Wow. Ich dachte immer, Fragments eigenes Layout würde den FrameLayout "Platzhalter" komplett ersetzen, aber ich sehe, dass das überhaupt nicht der Fall ist. Danke für diese Antwort! Es hat mir sehr geholfen. –

+0

Nett ,, Arbeiten. –

34

ich es geschafft, dieses Problem zu beheben durch Zugabe:

android: layout_marginTop = "attr/actionBarSize"

zum FrameLayout etwa so:

<FrameLayout 
     android:id="@+id/content" 
     android:layout_marginTop="?attr/actionBarSize" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
+4

Anstelle der Zugabe MarginTop App hinzufügen: layout_behavior = „@ Zeichenfolge/appbar_scrolling_view_behavior“ –

+2

perfekte Lösung, wenn @ String/appbar_scrolling_view_behavior nicht verfügbar ist –

+1

, die für CollapsingToolbarLayout nicht –

Verwandte Themen