Aggiungi visualizzazioni sotto la barra degli strumenti in CoordinatorLayout


176

Ho il seguente layout:

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

Aggiungo Fragments in FrameLayout, sostituendoli. Uno dei miei Fragmentè un elenco, che ha il seguente layout:

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

Il mio problema qui è che la barra degli strumenti è disegnata sopra l'elenco . Ho provato a risolverlo avvolgendo il contenuto di CoordinatorLayouta LinearLayout, che ha risolto il sovraccarico, ma in questo modo il comportamento di scorrimento della barra delle applicazioni non funziona più.

Ogni aiuto è molto apprezzato!

Risposte:


355

Prendi l'attributo

app:layout_behavior="@string/appbar_scrolling_view_behavior"

spegni RecyclerViewe metti su quello FrameLayoutche stai cercando di mostrare sotto Toolbar.

Ho scoperto che una cosa importante del comportamento della vista a scorrimento è il layout del componente sotto la barra degli strumenti. Poiché FrameLayoutha un discendente che scorrerà ( RecyclerView), CoordinatorLayoutotterrà quegli eventi a scorrimento per spostare il Toolbar.


Un'altra cosa da tenere presente: questo comportamento del layout farà sì che l' FrameLayoutaltezza venga dimensionata come se Toolbarfosse già stata fatta scorrere e, con la Toolbarvisualizzazione completa, l'intera vista viene semplicemente spostata verso il basso in modo che la parte inferiore della vista sia sotto la parte inferiore della CoordinatorLayout.

Questa è stata una sorpresa per me. Mi aspettavo che la vista venisse ridimensionata dinamicamente mentre la barra degli strumenti scorreva su e giù. Quindi, se hai un componente a scorrimento con un componente fisso nella parte inferiore della vista, non vedrai quel componente in basso fino a quando non avrai fatto scorrere completamente il file Toolbar.

Quindi, quando volevo ancorare un pulsante nella parte inferiore dell'interfaccia utente, ho risolto il problema mettendo il pulsante nella parte inferiore di CoordinatorLayout( android:layout_gravity="bottom") e aggiungendo un margine inferiore uguale all'altezza del pulsante alla vista sotto la barra degli strumenti.


1
Grazie mille, funziona davvero! Il mio unico problema dopo che se la barra degli strumenti è stata spostata, non è tornata dopo aver sostituito il Fragmentcontenimento con un elenco con un altro Fragment. Sono riuscito a mostrare manualmente la barra degli strumenti in questo modo.
WonderCsabo,

Wow. Ho sempre pensato che il layout di Fragment sostituisse completamente il "segnaposto" di FrameLayout, ma vedo che non è affatto così. Grazie per questa risposta! Mi ha aiutato molto.
Aspirante Dev

@Surendar D si prega di controllare questo se si può stackoverflow.com/questions/42968587/...
Mohamed Rihan

Bello. Grazie!
Razvan,

87

Sono riuscito a risolvere questo problema aggiungendo:

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

al FrameLayout in questo modo:

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

9
Invece di aggiungere marginTop aggiungi app: layout_behavior = "@ string / appbar_scrolling_view_behavior"
Naveed Ahmad

3
Soluzione perfetta quando @ string / appbar_scrolling_view_behavior non è disponibile
Julius

Si prega di utilizzareandroid:layout_marginTop="?android:attr/actionBarSize"
Martin Pfeffer il

6
Questo è un po 'confuso, l'aggiunta di un margine di ciò che potrebbe essere la dimensione (supponendo che avrai sempre una barra degli strumenti di quella dimensione) si romperà ad un certo punto
Kenny

0

A partire da Android Studio 3.4, è necessario inserire questa riga nel layout che contiene il RecyclerView.

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

0

Per utilizzare la barra degli strumenti superiore collassata o utilizzando ScrollFlags di tua scelta, possiamo fare così: Dal Material Design sbarazzati di 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>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.