ตัวอย่าง FloatingActionButton พร้อม Support Library


129

เมื่อเร็ว ๆ นี้ฉันอ่านบทความเหล่านี้:

ห้องสมุดสนับสนุนการออกแบบ Android

ห้องสมุดสนับสนุน Android, แก้ไข 22.2.0

FloatingActionButton

FloatingActionButtonแต่ไม่มีของพวกเขาให้ฉันเช่นรายละเอียดเกี่ยวกับการสร้างใหม่ ยากที่จะเข้าใจฉันถามคำถามนี้

ใครช่วยยกตัวอย่างเกี่ยวกับมันได้บ้าง

ความช่วยเหลือใด ๆ ที่จะชื่นชมมาก ขอบคุณล่วงหน้า.

แก้ไข

ฉันเพิ่งพบปัญหาบางอย่างในFloatingActionButton(FAB) และฉันต้องการปรับปรุงคำตอบอื่น ดูคำตอบของฉันด้านล่าง


คำตอบ:


274

ดังนั้นในbuild.gradleไฟล์ของคุณเพิ่ม:

compile 'com.android.support:design:27.1.1'

AndroidX หมายเหตุ: Google กำลังแนะนำไลบรารีส่วนขยาย AndroidXใหม่เพื่อแทนที่ไลบรารีสนับสนุนที่เก่ากว่า หากต้องการใช้ AndroidX, เป็นครั้งแรกให้แน่ใจว่าคุณอัปเดตของคุณgradle.propertiesไฟล์แก้ไขbuild.gradleชุดcompileSdkVersionไป28(หรือสูงกว่า) และใช้บรรทัดต่อไปนี้แทนก่อนหน้านี้compileหนึ่ง

implementation 'com.google.android.material:material:1.0.0'

ถัดไปในของคุณthemes.xmlหรือstyles.xmlอะไรก็ตามให้แน่ใจว่าคุณตั้งค่านี้ - มันเป็นสีที่เน้นเสียงของแอป - และสีของ FAB ของคุณเว้นแต่คุณจะแทนที่ (ดูด้านล่าง):

        <item name="colorAccent">@color/floating_action_button_color</item>

ใน XML ของโครงร่าง:

<RelativeLayout
 ...
 xmlns:app="http://schemas.android.com/apk/res-auto">

       <android.support.design.widget.FloatingActionButton
            android:id="@+id/myFAB"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_plus_sign"
            app:elevation="4dp"
            ... />

</RelativeLayout>

หรือถ้าคุณใช้ไลบรารีวัสดุ AndroidX ด้านบนคุณจะต้องใช้สิ่งนี้แทน:

<RelativeLayout
 ...
 xmlns:app="http://schemas.android.com/apk/res-auto">

       <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/myFAB"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:srcCompat="@drawable/ic_plus_sign"
            app:elevation="4dp"
            ... />

</RelativeLayout>

คุณสามารถดูตัวเลือกเพิ่มเติมในเอกสาร ( เอกสารวัสดุที่นี่) ( setRippleColorฯลฯ ) แต่มีหนึ่งในบันทึกย่อ:

    app:fabSize="mini"

อีกอันที่น่าสนใจ - หากต้องการเปลี่ยนสีพื้นหลังของ FAB เพียงอันเดียวให้เพิ่ม:

    app:backgroundTint="#FF0000"

(ตัวอย่างเช่นเปลี่ยนเป็นสีแดง) เป็น XML ด้านบน

อย่างไรก็ตามในโค้ดหลังจากมุมมองของกิจกรรม / แฟรกเมนต์นั้นสูงเกินจริง ....

    FloatingActionButton myFab = (FloatingActionButton)  myView.findViewById(R.id.myFAB);
    myFab.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            doMyThing();
        }
    });

ข้อสังเกต:

  • หากคุณมีหนึ่งในปุ่มเหล่านั้นที่อยู่บน "ตะเข็บ" ที่แยกสองมุมมอง (โดยใช้ตัวอย่างเช่น RelativeLayout) พร้อมกับพูดว่าขอบด้านล่างของเลย์เอาท์เชิงลบเพื่อซ้อนทับขอบคุณจะสังเกตเห็นปัญหา: ขนาดของ FAB นั้นจริงแตกต่างกันมากเมื่อเทียบกับ lollipop กับ pre-lollipop คุณสามารถเห็นสิ่งนี้ในเครื่องมือแก้ไขเลย์เอาท์แบบวิชวลของเอเอสเมื่อคุณสลับไปมาระหว่าง APIs - มัน 'ดึงออกมา' เมื่อคุณสลับไปที่ pre-lollipop เหตุผลที่ขนาดพิเศษดูเหมือนจะเป็นเพราะเงาขยายขนาดของมุมมองในทุกทิศทาง ดังนั้นคุณต้องพิจารณาสิ่งนี้เมื่อคุณปรับระยะขอบของ FAB หากมันใกล้เคียงกับสิ่งอื่น ๆ
  • นี่คือวิธีลบหรือเปลี่ยนช่องว่างภายในหากมีมากเกินไป:

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams) myFab.getLayoutParams();
        p.setMargins(0, 0, 0, 0); // get rid of margins since shadow area is now the margin
        myFab.setLayoutParams(p);
    }
  • นอกจากนี้ฉันกำลังจะวางโปรแกรม FAB โดยใช้โปรแกรมใน "ตะเข็บ" ระหว่างสองพื้นที่ใน RelativeLayout โดยคว้าความสูงของ FAB หารด้วยสองและใช้สิ่งนั้นเป็นออฟเซ็ตระยะขอบ แต่ myFab.getHeight () กลับมาเป็นศูนย์แม้หลังจากมุมมองที่สูงเกินจริงก็ดูเหมือน แต่ฉันใช้ ViewTreeObserver เพื่อให้ได้ความสูงหลังจากวางและวางตำแหน่ง ดูเคล็ดลับนี้ ที่นี่ ดูเหมือนว่านี้:

        ViewTreeObserver viewTreeObserver = closeButton.getViewTreeObserver();
        if (viewTreeObserver.isAlive()) {
            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                        closeButton.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    } else {
                        closeButton.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    }
                    // not sure the above is equivalent, but that's beside the point for this example...
                    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) closeButton.getLayoutParams();
                    params.setMargins(0, 0, 16, -closeButton.getHeight() / 2); // (int left, int top, int right, int bottom)
                    closeButton.setLayoutParams(params);
                }
            });
        }

    ไม่แน่ใจว่านี่เป็นวิธีที่ถูกต้องหรือไม่ แต่ดูเหมือนว่าจะใช้งานได้

  • ดูเหมือนว่าคุณสามารถทำให้พื้นที่เงาของปุ่มเล็กลงได้โดยลดระดับความสูง
  • หากคุณต้องการ FAB ใน "ตะเข็บ" คุณสามารถใช้layout_anchorและlayout_anchorGravityนี่คือตัวอย่าง:

    <android.support.design.widget.FloatingActionButton
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        app:layout_anchor="@id/appbar"
        app:layout_anchorGravity="bottom|right|end"
        android:src="@drawable/ic_discuss"
        android:layout_margin="@dimen/fab_margin"
        android:clickable="true"/>

โปรดจำไว้ว่าคุณจะสามารถมีการกระโดดปุ่มออกจากทางเมื่อSnackbarขึ้นมาโดยการตัดไว้ในCoordinatorLayout

มากกว่า:


1
แน่ใจ เพียงเพิ่มandroid:backgroundTint="#FF0000"ตัวอย่างไปที่ FloatingActionBar ใน XML (เพิ่มเพื่อตอบ)
fattire

1
อืมมม โอเคฉันจะเปลี่ยนมันด้านบนแล้ว ขอบคุณ! Dark Leonhart - ฉันไม่ได้เห็นอะไรเลยเกี่ยวกับการส่งคืนภายในอย่างรวดเร็ว แต่มีตัวอย่างของการทำที่อื่นใน stackoverflow ที่ฉันคิดว่าจะยังคงทำงานได้ รวมทั้งห้องสมุดบางแห่งก็มีให้บริการเช่นกัน
fattire

1
ส่วนประกอบนี้ในฐานะของ 22.2.0 ในความคิดของฉันยังไม่พร้อมผลิต Btw อาจเป็นตัวพิมพ์ผิด แต่ไม่ได้ใช้spในคุณสมบัติ evelation ควรเป็นapp:elevation="4dp"
Joao Sousa

1
หมายเหตุหากคุณเพิ่มFloatingActionButtona CoordinatorLayout, คุณสามารถใช้app:layout_anchor="element_with_seam"และapp:layout_anchorGravity="bottom|right|end"เพื่อวางตำแหน่ง FAB ได้อย่างถูกต้องมากกว่าตะเข็บ - ดูรูปแบบ activity_detail จาก cheesesquare
ianhanniballake

2
@DarkLeonhart - ลองดูตัวอย่างของการแสดง / ซ่อน FAB เมื่อเลื่อนโดยขยายพฤติกรรมของมัน
ianhanniballake

49

ฉันเพิ่งพบปัญหาบางอย่างใน FAB และฉันต้องการปรับปรุงคำตอบอื่น


ปัญหา setRippleColor

ดังนั้นปัญหาจะมาเมื่อคุณตั้งค่าสีระลอก (สี FAB บนกด) setRippleColorโปรแกรมผ่าน แต่เรายังมีวิธีอื่นในการตั้งค่าเช่นโดยการโทร:

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
ColorStateList rippleColor = ContextCompat.getColorStateList(context, R.color.fab_ripple_color);
fab.setBackgroundTintList(rippleColor);

โครงการของคุณต้องมีโครงสร้างนี้:

/res/color/fab_ripple_color.xml

ป้อนคำอธิบายรูปภาพที่นี่

และรหัสจากfab_ripple_color.xmlคือ:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/fab_color_pressed" />
    <item android:state_focused="true" android:color="@color/fab_color_pressed" />
    <item android:color="@color/fab_color_normal"/>
</selector>

สุดท้ายปรับเปลี่ยน FAB ของคุณเล็กน้อย:

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_action_add"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    app:fabSize="normal"
    app:borderWidth="0dp"
    app:elevation="6dp"
    app:pressedTranslationZ="12dp"
    app:rippleColor="@android:color/transparent"/> <!-- set to transparent color -->

สำหรับ API ระดับ 21 และสูงกว่าให้ตั้งค่าระยะขอบด้านขวาและด้านล่างเป็น 24dp:

...
android:layout_marginRight="24dp"
android:layout_marginBottom="24dp" />

คู่มือการออกแบบ FloatingActionButton

อย่างที่คุณเห็นบนรหัส xml FAB ของฉันด้านบนฉันตั้งค่า:

        ...
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        app:elevation="6dp"
        app:pressedTranslationZ="12dp"
        ...
  • โดยการตั้งค่าคุณลักษณะเหล่านี้คุณไม่จำเป็นต้องตั้งค่าlayout_marginTopและlayout_marginRightอีกครั้ง (เฉพาะในช่วงก่อนอมยิ้ม) Android จะวางไว้ที่ด้านขวาของหน้าจอโดยอัตโนมัติซึ่งเหมือนกับ FAB ปกติใน Android Lollipop

        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"

หรือคุณสามารถใช้สิ่งนี้ในCoordinatorLayout:

        android:layout_gravity="end|bottom"

กฎ FAB


5
ยกนิ้วให้สำหรับการวิจัยที่เกี่ยวข้อง บวก 1 pressedTranslationZสำหรับ ฉันไม่รู้
Joao Sousa

app: elevation = "6dp" แอพ: pressedTranslationZ = "12dp" ทำเคล็ดลับสำหรับ pre-lollipop แต่ fab ของฉันอยู่ที่มุมของหน้าจอ Lollipop อย่างแท้จริง
Thiago

1
คุณกำลังใช้ค่าที่ไม่ถูกต้องสำหรับ "pressedTranslationZ" มันไม่ใช่มูลค่าของการยกระดับในสภาวะกด PressedElevation = elevation + pressedTranslationZ ดังนั้นค่าที่ถูกต้องคือแอป: elevation = "6dp" แอพ: pressedTranslationZ = "6dp"
e.shishkin

3
จริงๆแล้วคุณไม่จำเป็นต้องตั้งค่าapp:elevationและapp:pressedTranslationZค่า ค่าเริ่มต้นคือค่าที่กำหนดในแนวทางการออกแบบวัสดุ อย่างไรก็ตาม e.shishkin เป็นสิทธิค่าจะเป็นและapp:elevation:6dp pressedTranslationZ:6dpคุณสามารถตรวจสอบได้ในซอร์สโค้ด
Christian García

12

FloatingActionButtonImageViewขยาย ดังนั้นจึงเป็นเรื่องง่ายเหมือนแนะนำImageViewในเค้าโครงของคุณ นี่คือตัวอย่าง XML

<android.support.design.widget.FloatingActionButton   xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/somedrawable"
    android:layout_gravity="right|bottom"
    app:borderWidth="0dp"
    app:rippleColor="#ffffff"/>

app:borderWidth="0dp" ถูกเพิ่มเป็นวิธีแก้ปัญหาสำหรับปัญหาการยกระดับสิทธิ์


4

สำหรับ AndroidX ใช้เช่น

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/ic_add" />

1

หากคุณเพิ่มห้องสมุดทั้งหมดแล้ว แต่ก็ยังไม่สามารถใช้งานได้:

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/ic_add" 
/>

แทน:

<android.support.design.widget.FloatingActionButton
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   app:srcCompat="@drawable/ic_add"
 />

และทุกอย่างจะทำงานได้ดี :)

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