Thêm các khung nhìn bên dưới thanh công cụ trong Điều phối viên


176

Tôi có bố cục như sau:

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

Tôi thêm Fragments vào FrameLayout, thay thế chúng. Một trong những Fragmentdanh sách của tôi là một danh sách, có bố cục như sau:

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

Vấn đề của tôi ở đây là thanh công cụ được vẽ qua danh sách . Tôi đã cố gắng giải quyết điều đó bằng cách gói nội dung của CoordinatorLayoutmột LinearLayout, điều đó đã giải quyết việc rút tiền, nhưng theo cách đó, hành vi cuộn của thanh ứng dụng không còn hoạt động.

Bất kỳ sự giúp đỡ nào cũng được đánh giá cao!

Câu trả lời:


355

Lấy thuộc tính

app:layout_behavior="@string/appbar_scrolling_view_behavior"

tắt RecyclerViewvà đặt nó trên cái FrameLayoutmà bạn đang cố gắng thể hiện dưới Toolbar.

Tôi đã thấy rằng một điều quan trọng mà hành vi xem cuộn thực hiện là bố trí thành phần bên dưới thanh công cụ. Bởi vì FrameLayoutcó một hậu duệ sẽ cuộn ( RecyclerView), nên CoordinatorLayoutsẽ có những sự kiện cuộn để di chuyển Toolbar.


Một điều khác cần lưu ý: Hành vi bố cục đó sẽ khiến FrameLayoutchiều cao có kích thước như thể Toolbarđã được cuộn và với màn hình Toolbarđược hiển thị đầy đủ, toàn bộ chế độ xem chỉ đơn giản được đẩy xuống để phần dưới của chế độ xem nằm dưới đáy của chế độ xem CoordinatorLayout.

Đây là một bất ngờ đối với tôi. Tôi đã mong đợi chế độ xem được thay đổi kích thước động khi thanh công cụ được cuộn lên xuống. Vì vậy, nếu bạn có một thành phần cuộn với một thành phần cố định ở cuối chế độ xem của bạn, bạn sẽ không thấy thành phần dưới cùng đó cho đến khi bạn đã cuộn hoàn toàn Toolbar.

Vì vậy, khi tôi muốn neo một nút ở dưới cùng của giao diện người dùng, tôi đã khắc phục điều này bằng cách đặt nút ở dưới cùng của CoordinatorLayout( android:layout_gravity="bottom") và thêm một lề dưới bằng với chiều cao của nút vào chế độ xem bên dưới thanh công cụ.


1
Cảm ơn rất nhiều, điều này thực sự hoạt động! Vấn đề duy nhất của tôi sau đó là nếu thanh công cụ bị di chuyển ra ngoài, nó không trở lại sau khi thay thế Fragmentchứa bằng một danh sách bằng một danh sách khác Fragment. Tôi quản lý để hiển thị thủ công thanh công cụ theo cách này .
WonderCsabo

Ồ Tôi luôn nghĩ rằng bố cục riêng của Fragment đã thay thế hoàn toàn "giữ chỗ" của FrameLayout nhưng tôi thấy đó hoàn toàn không phải là trường hợp. Cảm ơn câu trả lời này! Nó đã giúp tôi rất nhiều.
Khát vọng Dev

@Surendar D vui lòng kiểm tra điều này nếu bạn có thể stackoverflow.com/questions/42968587/iêu
Mohamed Rihan

Đẹp. Cảm ơn bạn!
Razvan

86

Tôi đã cố gắng khắc phục điều này bằng cách thêm:

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

vào FrameLayout như vậy:

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

9
Thay vì thêm marginTop, hãy thêm ứng dụng: layout_behavior = "@ string / appbar_scrolling_view_behavior"
Naveed Ahmad

3
Giải pháp hoàn hảo khi @ string / appbar_scrolling_view_behavior không khả dụng
Julius

Vui lòng sử dụngandroid:layout_marginTop="?android:attr/actionBarSize"
Martin Pfeffer

6
Đây là một loại hacky, thêm một lề của kích thước MIGHT (giả sử bạn sẽ luôn có một thanh công cụ có kích thước) sẽ bị phá vỡ tại một số điểm
Kenny

0

Kể từ Android studio 3.4, bạn cần đặt dòng này trong Bố cục chứa RecyclerView.

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

0

Để sử dụng thu gọn ToolBar hàng đầu hoặc sử dụng ScrollFlags theo lựa chọn của riêng bạn, chúng tôi có thể thực hiện theo cách này: Từ Thiết kế Vật liệu loại bỏ 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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.