เพิ่มมุมมองด้านล่างแถบเครื่องมือใน CoordinatorLayout


176

ฉันมีเค้าโครงต่อไปนี้:

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

ฉันเพิ่มFragments เข้าไปFrameLayoutแทนที่พวกเขา หนึ่งในฉันFragmentคือรายการซึ่งมีรูปแบบต่อไปนี้:

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

ปัญหาของฉันที่นี่ที่แถบเครื่องมือจะถูกวาดขึ้นในช่วงรายการ ฉันพยายามที่จะแก้ปัญหานั้นด้วยการห่อเนื้อหาของCoordinatorLayoutลงใน a LinearLayoutที่แก้ปัญหาการถอนเงินเกิน แต่วิธีที่พฤติกรรมการเลื่อนของแถบแอปไม่ทำงานอีกต่อไป

ความช่วยเหลือใด ๆ ที่ชื่นชมมาก!

คำตอบ:


355

รับคุณลักษณะ

app:layout_behavior="@string/appbar_scrolling_view_behavior"

ปิดRecyclerViewและวางไว้บนที่คุณกำลังพยายามที่จะแสดงภายใต้FrameLayoutToolbar

ฉันพบว่าสิ่งสำคัญสิ่งหนึ่งที่พฤติกรรมของมุมมองเลื่อนคือการจัดวางองค์ประกอบด้านล่างแถบเครื่องมือ เพราะFrameLayoutมีลูกหลานที่จะเลื่อน ( RecyclerView) ที่จะได้รับการเลื่อนเหตุการณ์เหล่านั้นสำหรับการเคลื่อนย้ายCoordinatorLayoutToolbar


อีกสิ่งหนึ่งที่ควรระวัง: พฤติกรรมของเลย์เอาต์นั้นจะทำให้FrameLayoutความสูงถูกปรับขนาดราวกับว่าToolbarถูกเลื่อนไปแล้วและด้วยการToolbarแสดงผลอย่างเต็มที่มุมมองทั้งหมดจะถูกผลักลงเพื่อให้ด้านล่างของมุมมองอยู่ด้านล่างด้านล่างของCoordinatorLayout.

นี่เป็นเรื่องประหลาดใจสำหรับฉัน ฉันคาดหวังว่ามุมมองจะถูกปรับขนาดแบบไดนามิกเนื่องจากแถบเครื่องมือถูกเลื่อนขึ้นและลง Toolbarดังนั้นถ้าคุณมีองค์ประกอบเลื่อนที่มีส่วนประกอบคงที่ด้านล่างของมุมมองของคุณคุณจะไม่เห็นว่าองค์ประกอบด้านล่างจนกว่าคุณจะได้เลื่อนอย่างเต็มที่

ดังนั้นเมื่อฉันต้องการที่จะยึดปุ่มไว้ที่ด้านล่างของ UI ฉันจึงทำสิ่งนี้โดยใส่ปุ่มที่ด้านล่างของCoordinatorLayout( android:layout_gravity="bottom") และเพิ่มระยะขอบด้านล่างเท่ากับความสูงของปุ่มในมุมมองด้านล่างของแถบเครื่องมือ


1
ขอบคุณมากมันใช้งานได้จริง! ปัญหาเดียวของฉันหลังจากนั้นหากแถบเครื่องมือถูกย้ายออกก็ไม่ได้กลับมาหลังจากแทนที่รายการFragmentที่มีรายการอื่นFragmentด้วย ฉันจัดการเพื่อแสดงแถบเครื่องมือด้วยตนเองนี้ทาง
WonderCsabo

ว้าว. ฉันคิดเสมอว่าเลย์เอาต์ของตัวเอง Fragment มาแทนที่ "Placeholder" ของ FrameLayout อย่างสมบูรณ์ แต่ฉันเห็นว่านั่นไม่ใช่สิ่งที่เกิดขึ้นเลย ขอบคุณสำหรับคำตอบนี้! มันช่วยฉันได้มาก
Aspiring Dev

@Surendar D โปรดตรวจสอบสิ่งนี้หากคุณสามารถstackoverflow.com/questions/42968587/…
Mohamed Rihan

ดี ขอบคุณ!
Razvan

87

ฉันจัดการเพื่อแก้ไขปัญหานี้โดยการเพิ่ม:

หุ่นยนต์: layout_marginTop = "หุ่นยนต์: attr / actionBarSize"

ไปที่ FrameLayout ดังนี้:

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

9
แทนที่จะเพิ่ม marginTop เพิ่มแอป: layout_behavior = "@ string / appbar_scrolling_view_behavior"
Ahmad Naveed

3
โซลูชั่นที่สมบูรณ์แบบเมื่อ @ string / appbar_scrolling_view_behavior ไม่พร้อมใช้งาน
Julius

โปรดใช้android:layout_marginTop="?android:attr/actionBarSize"
Martin Pfeffer

6
นี่คือแฮ็คที่ค่อนข้างจะเพิ่มระยะขอบที่ขนาดอาจจะ (สมมติว่าคุณจะมีแถบเครื่องมือขนาดนั้นอยู่เสมอ) กำลังจะแตกในบางจุด
Kenny

0

ในฐานะของ Android 3.4 สตูดิโอ, RecyclerViewคุณจะต้องใส่บรรทัดนี้ในรูปแบบของคุณซึ่งถือ

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

0

ในการใช้การยุบ ToolBar หรือใช้ ScrollFlags ตามที่คุณต้องการเราสามารถทำได้ดังนี้: จาก Material Designกำจัด 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>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.