Ví dụ FloatingActionButton với Thư viện hỗ trợ


129

Gần đây, tôi đọc những bài viết này:

Thư viện hỗ trợ thiết kế Android

Thư viện hỗ trợ Android, phiên bản 22.2.0

FloatingActionButton

Nhưng, không ai trong số họ cho tôi một ví dụ chi tiết về việc tạo mới FloatingActionButton. Thật khó hiểu, tôi hỏi câu hỏi này.

Bất cứ ai có thể cho tôi một ví dụ về nó?

Bất kỳ trợ giúp nhiều được đánh giá cao. Cảm ơn trước.

BIÊN TẬP

Tôi chỉ tìm thấy một số vấn đề trên FloatingActionButton(FAB), và tôi muốn cải thiện một câu trả lời khác. Xem câu trả lời của tôi dưới đây.


Câu trả lời:


274

Vì vậy, trong build.gradletập tin của bạn , thêm điều này:

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

Lưu ý về AndroidX: Google đang giới thiệu các thư viện mở rộng AndroidX mới để thay thế các Thư viện hỗ trợ cũ hơn. Để sử dụng AndroidX, trước tiên hãy đảm bảo bạn đã cập nhật gradle.propertiestệp của mình , được chỉnh sửa build.gradleđể đặt compileSdkVersionthành 28(hoặc cao hơn) và sử dụng dòng sau thay vì dòng trước compile.

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

Tiếp theo, trong bạn themes.xmlhoặc styles.xmlhoặc bất cứ điều gì, hãy chắc chắn rằng bạn thiết lập this- nó color-- giọng của ứng dụng của bạn và màu sắc của FAB bạn trừ khi bạn ghi đè lên nó (xem dưới đây):

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

Trong XML của bố cục:

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

Hoặc nếu bạn đang sử dụng thư viện tài liệu AndroidX ở trên, thay vào đó bạn sẽ sử dụng thư viện này:

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

Bạn có thể thấy nhiều tùy chọn hơn trong các tài liệu (tài liệu vật liệu ở đây) ( setRippleColor, v.v.), nhưng một trong những lưu ý là:

    app:fabSize="mini"

Một điều thú vị khác-- để thay đổi màu nền của chỉ một FAB, hãy thêm:

    app:backgroundTint="#FF0000"

(ví dụ để thay đổi nó thành màu đỏ) thành XML ở trên.

Dù sao, trong mã, sau khi chế độ xem Hoạt động / Đoạn bị thổi phồng ....

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

Quan sát:

  • Nếu bạn có một trong các nút trên "đường may" chia hai chế độ xem (ví dụ: sử dụng RelativeLayout) với lề bố cục dưới cùng âm để chồng lên đường viền, bạn sẽ nhận thấy một vấn đề: thực sự kích thước của FAB rất khác nhau về kẹo mút so với kẹo mút trước. Bạn thực sự có thể thấy điều này trong trình chỉnh sửa bố cục hình ảnh của AS khi bạn lật giữa các API-- nó đột nhiên "phồng ra" khi bạn chuyển sang dùng kẹo mút trước. Lý do cho kích thước thêm dường như là bóng mở rộng kích thước của chế độ xem theo mọi hướng. Vì vậy, bạn phải tính đến điều này khi bạn điều chỉnh tỷ suất lợi nhuận của FAB nếu nó gần với các công cụ khác.
  • Đây là một cách để loại bỏ hoặc thay đổi phần đệm nếu có quá nhiều:

    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);
    }
  • Ngoài ra, tôi sẽ lập trình đặt FAB trên "đường nối" giữa hai khu vực trong RelativeLayout bằng cách lấy chiều cao của FAB, chia cho hai và sử dụng nó làm phần bù lề. Nhưng myFab.getHeight () đã trả về số 0, ngay cả sau khi chế độ xem bị thổi phồng, dường như. Thay vào đó, tôi đã sử dụng ViewTreeObserver để chỉ lấy chiều cao sau khi đặt ra và sau đó đặt vị trí. Xem mẹo này ở đây . Nó trông như thế này:

        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);
                }
            });
        }

    Không chắc chắn nếu đây là cách đúng đắn để làm điều đó, nhưng nó dường như làm việc.

  • Dường như bạn có thể làm cho không gian bóng của nút nhỏ hơn bằng cách giảm độ cao.
  • Nếu bạn muốn FAB trên một "đường may", bạn có thể sử dụng layout_anchorlayout_anchorGravityđây là một ví dụ:

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

Hãy nhớ rằng bạn có thể tự động bật nút nhảy ra khi Snackbar xuất hiện bằng cách gói nó trong Bộ điều phối .

Hơn:


1
Chắc chắn rồi. Chỉ cần thêm android:backgroundTint="#FF0000"ví dụ vào FloatingActionBar trong XML. (thêm vào câu trả lời)
fattire

1
Hừm. Được rồi tôi sẽ thay đổi nó ở trên. Cảm ơn! Dark Leonhart-- Tôi chưa thấy bất cứ điều gì về tích hợp nhanh trở lại nhưng có những mẫu thực hiện ở nơi khác trên stackoverflow mà tôi cho rằng vẫn sẽ hoạt động. Cộng với một số thư viện có sẵn mà làm điều đó là tốt.
vỗ béo

1
Thành phần này, kể từ ngày 22.2.0, theo tôi, chưa sẵn sàng sản xuất. Btw, có thể là một lỗi đánh máy, nhưng không sử dụng sptrong thuộc tính evelation. Nó nên làapp:elevation="4dp"
Joao Sousa

1
Lưu ý nếu bạn thêm a FloatingActionButtonvào a CoordinatorLayout, bạn có thể sử dụng app:layout_anchor="element_with_seam"app:layout_anchorGravity="bottom|right|end"định vị FAB chính xác trên một đường may - xem bố cục Activity_detail từ cheesesapes
ianhanniballake

2
@DarkLeonhart - xem ví dụ của tôi về hiển thị / ẩn FAB khi cuộn bằng cách mở rộng hành vi của nó.
ianhanniballake

49

Tôi chỉ tìm thấy một số vấn đề trên FAB và tôi muốn nâng cao một câu trả lời khác.


vấn đề setRípColor

Vì vậy, vấn đề sẽ đến khi bạn đặt màu gợn (màu FAB khi nhấn) theo chương trình setRippleColor. Nhưng, chúng ta vẫn có một cách khác để đặt nó, tức là bằng cách gọi:

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

Dự án của bạn cần phải có cấu trúc này:

/res/color/fab_ripple_color.xml

nhập mô tả hình ảnh ở đây

Và mã từ fab_ripple_color.xmllà:

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

Cuối cùng, thay đổi FAB của bạn một chút:

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

Đối với API cấp 21 trở lên, hãy đặt lề phải và dưới cùng thành 24dp:

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

Hướng dẫn thiết kế FloatingActionButton

Như bạn có thể thấy trên mã xml FAB của tôi ở trên, tôi đặt:

        ...
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        app:elevation="6dp"
        app:pressedTranslationZ="12dp"
        ...
  • Bằng cách thiết lập những thuộc tính này, bạn không cần phải thiết lập layout_marginToplayout_marginRightmột lần nữa (chỉ trên trước Lollipop). Android sẽ đặt nó tự động ở phía bên phải của màn hình, giống như FAB bình thường trong Android Lollipop.

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

Hoặc, bạn có thể sử dụng điều này trong CoordinatorLayout:

        android:layout_gravity="end|bottom"
  • Bạn cần phải có 6dp elevationvà 12dp pressedTranslationZ, theo hướng dẫn này từ Google.

Quy tắc FAB


5
giơ ngón tay cái lên cho các nghiên cứu liên quan. cộng 1 cho pressedTranslationZ. Tôi không biết điều đó.
Joao Sousa

app: elevation = "6dp" app: pressTranslationZ = "12dp" thực hiện thủ thuật cho kẹo mút trước, nhưng fab của tôi thực sự nằm ở góc màn hình trên Lollipop
Thiago

1
Bạn đang sử dụng một giá trị không chính xác cho "pressTranslationZ". Đó không phải là giá trị của độ cao trên trạng thái ép. Đã nhấnElevation = độ cao + nhấnTranslationZ. Vì vậy, giá trị chính xác là ứng dụng: elevation = "6dp" ứng dụng: pressTranslationZ = "6dp"
e.shishkin

3
Trên thực tế, bạn không cần phải thiết lập app:elevationapp:pressedTranslationZgiá trị. Giá trị mặc định của chúng là giá trị được xác định trong hướng dẫn thiết kế Vật liệu. Dù sao, e.shishkin là đúng, các giá trị là app:elevation:6dppressedTranslationZ:6dp. Bạn có thể kiểm tra nó trong mã nguồn
Christian García

12

FloatingActionButtonkéo dài ImageView. Vì vậy, nó đơn giản giống như giới thiệu một ImageViewtrong bố cục của bạn. Đây là một mẫu 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" được thêm vào như một cách giải quyết cho các vấn đề về độ cao.


4

cho AndroidX sử dụng như

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

1

Nếu bạn đã thêm tất cả các thư viện và nó vẫn không hoạt động, hãy sử dụng:

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

thay vì:

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

Và tất cả sẽ hoạt động tốt :)

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.