Tambahkan tampilan di bawah toolbar di CoordinatorLayout


176

Saya memiliki tata letak berikut:

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

Saya menambahkan Fragments ke dalam FrameLayout, menggantinya. Salah satu dari saya Fragmentadalah daftar, yang memiliki tata letak berikut:

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

Masalah saya di sini adalah bilah alat digambar di atas daftar . Saya mencoba menyelesaikannya dengan membungkus konten CoordinatorLayoutke dalam LinearLayout, yang menyelesaikan penarikan berlebih, tetapi dengan cara itu perilaku gulir appbar tidak lagi berfungsi.

Bantuan apa pun sangat kami hargai!

Jawaban:


355

Ambil atributnya

app:layout_behavior="@string/appbar_scrolling_view_behavior"

off RecyclerViewdan meletakkannya di FrameLayoutbahwa Anda sedang mencoba untuk menunjukkan di bawah Toolbar.

Saya telah menemukan bahwa satu hal penting yang dilakukan oleh perilaku tampilan pengguliran adalah menata komponen di bawah bilah alat. Karena FrameLayoutmemiliki keturunan yang akan menggulir ( RecyclerView), mereka CoordinatorLayoutakan mendapatkan acara yang bergulir untuk memindahkan Toolbar.


Satu hal lagi yang harus diperhatikan: Perilaku tata letak itu akan menyebabkan FrameLayoutketinggian menjadi seakan- Toolbarakan sudah digulir , dan dengan Toolbarditampilkan sepenuhnya seluruh tampilan hanya didorong ke bawah sehingga bagian bawah tampilan berada di bawah bagian bawah layar. CoordinatorLayout.

Ini mengejutkan saya. Saya mengharapkan tampilan diubah ukuran secara dinamis karena bilah alat digulir ke atas dan ke bawah. Jadi jika Anda memiliki komponen gulir dengan komponen tetap di bagian bawah tampilan Anda, Anda tidak akan melihat komponen bawah sampai Anda sepenuhnya menggulir Toolbar.

Jadi ketika saya ingin meletakkan sebuah tombol di bagian bawah UI, saya mengatasinya dengan meletakkan tombol di bagian bawah CoordinatorLayout( android:layout_gravity="bottom") dan menambahkan margin bawah sama dengan tinggi tombol ke tampilan di bawah bilah alat.


1
Terima kasih banyak, ini sangat berhasil! Satu-satunya masalah saya setelah itu jika bilah alat dipindahkan, itu tidak kembali setelah mengganti yang Fragmentberisi dengan daftar dengan yang lain Fragment. Saya berhasil menampilkan bilah alat secara manual dengan cara ini .
WonderCsabo

Wow. Saya selalu berpikir tata letak Fragment sepenuhnya menggantikan "placeholder" FrameLayout tapi saya melihat bahwa itu tidak terjadi sama sekali. Terima kasih atas jawaban ini! Itu banyak membantu saya.
Aspiring Dev

@Surendar D silahkan cek ini jika Anda dapat stackoverflow.com/questions/42968587/...
Mohamed Rihan

Bagus. Terima kasih!
Razvan

86

Saya berhasil memperbaikinya dengan menambahkan:

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

ke FrameLayout seperti ini:

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

9
Alih-alih menambahkan marginTop tambahkan aplikasi: layout_behavior = "@ string / appbar_scrolling_view_behavior"
Naveed Ahmad

3
Solusi sempurna ketika @ string / appbar_scrolling_view_behavior tidak tersedia
Julius

Silakan gunakanandroid:layout_marginTop="?android:attr/actionBarSize"
Martin Pfeffer

6
Ini agak berantakan, menambahkan margin dari ukuran MUNGKIN (dengan asumsi Anda akan selalu memiliki toolbar ukuran itu) akan rusak di beberapa titik
Kenny

0

Pada Android studio 3.4, Anda harus meletakkan baris ini di Layout Anda yang memegang RecyclerView.

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

0

Untuk menggunakan ToolBar atas yang runtuh atau menggunakan ScrollFlag pilihan Anda sendiri, kita dapat melakukan ini: Dari Desain Material, singkirkan 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>

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.