Dodaj widoki poniżej paska narzędzi w CoordinatorLayout


176

Mam następujący układ:

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

Dodaję Fragments do FrameLayout, zastępując je. Jedna z moich Fragmentlist to lista, która ma następujący układ:

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

Mój problem polega na tym, że pasek narzędzi jest rysowany nad listą . Próbowałem to rozwiązać, zawijając zawartość CoordinatorLayoutpliku w a LinearLayout, co rozwiązało problem przerysowania, ale w ten sposób zachowanie przewijania paska aplikacji nie działa.

Każda pomoc jest mile widziana!

Odpowiedzi:


355

Weź atrybut

app:layout_behavior="@string/appbar_scrolling_view_behavior"

wyłącz RecyclerViewi umieść go na tym FrameLayout, który próbujesz pokazać pod Toolbar.

Odkryłem, że jedną ważną rzeczą, jaką robi przewijanie widoku, jest rozmieszczenie komponentu poniżej paska narzędzi. Ponieważ FrameLayoutma potomka, który będzie przewijał ( RecyclerView), CoordinatorLayoutotrzyma te zdarzenia przewijania do przeniesienia Toolbar.


Jeszcze jedna rzecz, o której należy pamiętać: to zachowanie układu spowoduje, że FrameLayoutwysokość zostanie dopasowana tak, jakby Toolbarbyła już przewinięta , a przy Toolbarpełnym wyświetleniu cały widok jest po prostu przesuwany w dół, tak aby dolna część widoku znajdowała się poniżej dolnej krawędzi CoordinatorLayout.

To była dla mnie niespodzianka. Spodziewałem się, że rozmiar widoku będzie dynamicznie zmieniany, gdy pasek narzędzi będzie przewijany w górę iw dół. Więc jeśli masz przewijany komponent ze stałym komponentem u dołu widoku, nie zobaczysz tego dolnego komponentu, dopóki w pełni nie przewiniesz Toolbar.

Więc kiedy chciałem zakotwiczyć przycisk na dole interfejsu użytkownika, obejść ten problem, umieszczając przycisk na dole CoordinatorLayout( android:layout_gravity="bottom") i dodając dolny margines równy wysokości przycisku do widoku poniżej paska narzędzi.


1
Bardzo dziękuję, to naprawdę działa! Mój jedyny problem po tym, że jeśli pasek narzędzi został przeniesiony, nie wrócił po zastąpieniu Fragmentzawierającego listę inną Fragment. W ten sposób udało mi się ręcznie wyświetlić pasek narzędzi .
WonderCsabo

Łał. Zawsze myślałem, że własny układ Fragment całkowicie zastępuje „element zastępczy” FrameLayout, ale widzę, że wcale tak nie jest. Dzięki za tę odpowiedź! Bardzo mi to pomogło.
Aspiring Dev

@Surendar D, sprawdź to, jeśli możesz stackoverflow.com/questions/42968587/ ...
Mohamed Rihan

Miły. Dziękuję Ci!
Razvan,

87

Udało mi się to naprawić dodając:

android: layout_marginTop = "? android: attr / actionBarSize"

do FrameLayout w następujący sposób:

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

9
Zamiast dodawać marginTop dodaj aplikację: layout_behavior = "@ string / appbar_scrolling_view_behavior"
Naveed Ahmad

3
Idealne rozwiązanie, gdy @ string / appbar_scrolling_view_behavior nie jest dostępne
Julius

Proszę używaćandroid:layout_marginTop="?android:attr/actionBarSize"
Martin Pfeffer

6
To trochę hacky, dodanie marginesu tego, jaki może być rozmiar (zakładając, że zawsze będziesz mieć pasek narzędzi o takim rozmiarze), w pewnym momencie się
zepsuje

0

Począwszy od Android Studio 3.4, musisz umieścić tę linię w swoim układzie, która zawiera rozszerzenie RecyclerView.

app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior"

0

Aby użyć zwijanego górnego paska narzędzi lub używając dowolnie wybranych ScrollFlags, możemy zrobić to w następujący sposób: Z Material Design pozbądź się FrameLayout

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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">

<androidx.coordinatorlayout.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleGravity="top"
            app:layout_scrollFlags="scroll|enterAlways">


        <androidx.appcompat.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin">

            <ImageView
                android:id="@+id/ic_back"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/ic_arrow_back" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="back"
                android:textSize="16sp"
                android:textStyle="bold" />

        </androidx.appcompat.widget.Toolbar>


        </com.google.android.material.appbar.CollapsingToolbarLayout>
    </com.google.android.material.appbar.AppBarLayout>

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/post_details_recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:padding="5dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.