Android thay đổi màu nút hành động nổi


531

Tôi đã cố gắng thay đổi màu Nút hành động nổi của Vật liệu, nhưng không thành công.

<android.support.design.widget.FloatingActionButton
    android:id="@+id/profile_edit_fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="end|bottom"
    android:layout_margin="16dp"
    android:clickable="true"
    android:src="@drawable/ic_mode_edit_white_24dp" />

Tôi đã cố gắng thêm:

android:background="@color/mycolor"

hoặc thông qua mã:

FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.profile_edit_fab);
fab.setBackgroundColor(Color.parseColor("#mycolor"));

hoặc là

fab.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#mycolor")));

Nhưng không ai trong số trên làm việc. Tôi cũng đã thử các giải pháp trong câu hỏi trùng lặp được đề xuất, nhưng không có giải pháp nào trong số đó hoạt động; nút vẫn xanh và cũng trở thành một hình vuông.

Tái bút: Thật tuyệt khi biết cách thêm hiệu ứng gợn, cũng không thể hiểu điều đó.



Hiệu ứng Ripple không khả dụng trên các thiết bị tiền kẹo mút vì nó sử dụng RenderThread mới .
tachyonflux

@karaokyo ok nhưng tôi đang làm thế nào?
Jjang

27
Google thực hiện một công việc thực sự xấu trong quan điểm của tôi để thực hiện những điều accesible
Joop

Để thực hiện điều này theo chương trình và tương thích ngược, hãy xem stackoverflow.com/questions/30966222/iêu
Ralph Pina

Câu trả lời:


1049

Như đã mô tả trong tài liệu hướng dẫn , theo mặc định nó sẽ đưa các thiết lập màu sắc trong styles.xml thuộc tính colorAccent .

Màu nền của chế độ xem này mặc định cho colorAccent của chủ đề của bạn. Nếu bạn muốn thay đổi điều này trong thời gian chạy thì bạn có thể thực hiện thông qua setBackgroundTintList (ColorStateList).

Nếu bạn muốn thay đổi màu sắc

  • trong XML với ứng dụng thuộc tính : backgroundTint
<android.support.design.widget.FloatingActionButton
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_add"
    app:backgroundTint="@color/orange"
    app:borderWidth="0dp"
    app:elevation="6dp"
    app:fabSize="normal" >
  • trong mã với .setBackgroundTintList (câu trả lời dưới đây của ywwynm )

Như @Dantalian đã đề cập trong các nhận xét, nếu bạn muốn thay đổi màu biểu tượng cho Thư viện hỗ trợ thiết kế lên đến v22 (đã bao gồm) , bạn có thể sử dụng

android:tint="@color/white"     

Đối với Thư viện hỗ trợ thiết kế kể từ v23 cho bạn có thể sử dụng:

app:tint="@color/white"   

Ngoài ra với androidXcác thư viện, bạn cần đặt đường viền 0dp trong bố cục xml của mình:

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_add"
    app:backgroundTint="@color/orange"
    app:borderWidth="0dp"
    app:elevation="6dp"
    app:fabSize="normal" />

24
Điều này không hoạt động trong Thư viện hỗ trợ thiết kế v23 cho các thiết bị <API 12. Nó đã hoạt động vào năm 22, vì vậy họ đã phá vỡ một cái gì đó, rõ ràng.
đói

4
Lưu ý rằng nếu bạn cũng muốn thay đổi màu hình ảnh thành màu trắng, ví dụ bạn có thể sử dụng: android: tint = "@ android: color / white"
Dantalian

1
android: tint = "@ color / white" không hoạt động với tôi vì nó không thể giải quyết nó vì một số lý do. android: tint = "# ffffff" Mặc dù vậy tôi cũng làm việc
realappie 6/11/2015

2
Đó là bởi vì @ color / white không tồn tại trong colors.xml của bạn. sử dụng @android: màu / trắng hoặc tạo màu có tên là màu trắng hoặc bất cứ thứ gì bạn cần
Dantalian

227
sử dụng "ứng dụng: backgroundTint" chứ không phải "android: backgroundTint"
Vasil Valchev

244

Câu trả lời của Vijet Badigannavar là đúng nhưng việc sử dụng ColorStateListthường phức tạp và ông không cho chúng tôi biết cách thực hiện. Vì chúng ta thường tập trung vào việc thay đổi Viewmàu sắc ở trạng thái bình thường và bị ép, tôi sẽ thêm chi tiết:

  1. Nếu bạn muốn thay đổi FABmàu ở trạng thái bình thường, bạn chỉ cần viết

    mFab.setBackgroundTintList(ColorStateList.valueOf(your color in int));
  2. Nếu bạn muốn thay đổi FABmàu ở trạng thái nhấn, cảm ơn Thư viện hỗ trợ thiết kế 22.2.1 , bạn chỉ có thể viết

    mFab.setRippleColor(your color in int);

    Bằng cách đặt thuộc tính này, khi bạn nhấn lâu FAB, một gợn với màu của bạn sẽ xuất hiện tại điểm chạm của bạn và hiển thị ra toàn bộ bề mặt FAB. Xin lưu ý rằng nó sẽ không thay đổi FABmàu sắc ở trạng thái bình thường. Bên dưới API 21 (Lollipop), không có hiệu ứng gợn nhưng FABmàu của nó vẫn sẽ thay đổi khi bạn nhấn nó.

Cuối cùng, nếu bạn muốn triển khai hiệu ứng phức tạp hơn cho các trạng thái, thì bạn nên tìm hiểu sâu ColorStateList, đây là một câu hỏi SO thảo luận về nó: Làm cách nào để tạo ColorStateList theo lập trình? .

CẬP NHẬT: Cảm ơn bình luận của @ Kaitlyn. Để loại bỏ đột quỵ của FAB bằng cách sử dụng màu nền, bạn có thể đặt app:borderWidth="0dp"trong xml của mình.


3
Cảm ơn vì điều này, tôi đã không biết cách sử dụng ColorStateList. Tuy nhiên, mã của bạn để lại FAB của tôi với một nét (phác thảo) của màu nhấn chủ đề. Bạn có biết làm thế nào tôi có thể loại bỏ nét đó (hoặc thay đổi màu sắc của nó) và có FAB trong một màu đặc biệt trông giống như màu đặc biệt đó là màu nhấn không?
Kaitlyn Hanrahan

@KaitlynHanrahan Xin vui lòng xem cập nhật của tôi. Cám ơn bạn đã góp ý.
ywwynm

Điều đó hoạt động hoàn hảo - Lollypop và Kitkat trông giống nhau, thậm chí cả hai đều có một chút bóng mờ để FAB bật lên cùng màu trong nền (Tôi có một phần trên Thanh công cụ). Cám ơn rất nhiều! Điều đó thật đơn giản nhưng tôi không biết liệu tôi có thể tự mình tìm thấy điều đó không.
Kaitlyn Hanrahan

Có cách nào để thiết lập app:borderWidthchương trình? Cảm ơn
Štarke

@ Štarke Chà, sau khi xem mã nguồn của FloatingActionButton, tôi sợ rằng bạn không thể thiết lập nó theo chương trình ngay bây giờ vì không có setter cho mBorderWidth.
ywwynm

123

Như Vasil Valchev đã lưu ý trong một nhận xét, nó đơn giản hơn vẻ ngoài của nó, nhưng có một sự khác biệt tinh tế mà tôi không nhận thấy trong XML của mình.

<android.support.design.widget.FloatingActionButton
    android:id="@+id/profile_edit_fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="end|bottom"
    android:layout_margin="16dp"
    android:clickable="true"
    android:src="@drawable/ic_mode_edit_white_24dp"
    app:backgroundTint="@android:color/white"/>

Lưu ý rằng:

app:backgroundTint="@android:color/white"

không

android:backgroundTint="@android:color/white"

7
Điều này rất quan trọng vì đây là hai điều hoàn toàn khác nhau: android:backgroundTint=""là từ Api cấp 21 và một phần của Thiết kế Vật liệu Lollipop và sẽ bị bỏ qua bên dưới Lollipop. Ngoài ra, nó không thay đổi FABmàu sắc hoàn toàn vì nó không phải là một màu đơn sắc. Bạn phải sử dụng app:một để làm cho nó hoạt động.
creativecreatorormaybenot

1
Cảm ơn, sử dụng android:colorđã khiến ứng dụng của tôi bị sập, và nó đang khiến tôi phát điên! Cảm ơn vì đã lưu ứng dụng của tôi và những gì còn lại trong sự tỉnh táo của tôi ;-)
Kapenaar 30/03/2017

@Kapenaar không có vấn đề gì, đã gãi đầu một lúc cũng như trước khi nhận ra;)
HenriqueMS

Làm thế nào điều này sẽ hoạt động theo chương trình vì về phía java không có sự khác biệt như ứng dụng: và android: trong XML.
marienke

@marienke bạn có thể thiết lập nó với ColorStatesList, đăng câu hỏi mới và đăng liên kết tại đây để tôi có thể trả lời;)
HenriqueMS

58

Nếu bạn cố gắng thay đổi màu sắc của FAB bằng cách sử dụng ứng dụng, có một số vấn đề. khung của nút có màu khác nhau, vì vậy bạn phải làm gì:

app:backgroundTint="@android:color/transparent"

và trong mã đặt màu:

actionButton.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.white)));

2
Công việc này cho màu sắc bình thường. Nếu tôi đã cho màu alpha như # 44000000 thì vấn đề màu khung có thể lặp lại.
Dinesh

5
getResource.getColor () không được dùng nữa, hãy xem xét sử dụng ContextCompat.getColor (bối cảnh, màu sắc của bạn); thay thế. Hy vọng nó sẽ giúp
Tinashe Chinyanga

51

chỉ dùng,

app:backgroundTint="@color/colorPrimary"

không sử dụng,

android:backgroundTint="@color/colorPrimary"

hmmmm điều này khiến android studio tự động hoàn thành đưa ra kết quả sử dụng android: backgroundTint, câu trả lời này rất hay
Yudi karma

31

FAB được tô màu dựa trên của bạn colorAccent.

<style name="AppTheme" parent="Base.Theme.AppCompat.Light">
    <item name="colorAccent">@color/accent</item>
</style>

Chà, màu mặc định không phải là màu xanh lá cây. Nơi mà bạn đã thiết lập một màu xanh lá cây?
tachyonflux

1
Tôi không. Như bạn thấy, xml này là nơi duy nhất tôi thiết lập bố cục của nút ...
Jjang

Có lẽ bạn nên tạo một dự án mới chỉ với FAB và đăng mã cho toàn bộ.
tachyonflux

3
Wow ... về cơ bản tôi chỉ yêu cầu bạn làm điều tương tự và bạn không sẵn sàng làm điều đó. Bạn khá giả hình khi tin rằng mã của bạn là đầy đủ, nhưng việc bổ sung mã của tôi không đầy đủ. Nó rơi vào người hỏi để tạo MCVE . Cảm ơn.
tachyonflux

2
Không còn nữa, dựa trên Ánh xạ thuộc tính chủ đề Nút Nút hành động nổi bây giờ (tôi đã tự xác minh) được tô màu thành màuSaryary ( com.google.android.m Liệu : liệu: 1.1.0-alpha02 )
ievgen

26
mFab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext,R.color.mColor)));

Đây là giải pháp đơn giản nhất, cách dễ dàng hơn so với sử dụng một drawable tùy chỉnh.
IgorGanapolsky

16

Các giải pháp khác có thể làm việc. Đây là cách tiếp cận khỉ đột 10 pound có lợi thế là được áp dụng rộng rãi trong trường hợp này và các trường hợp tương tự:

Kiểu tệp:

<style name="AppTheme.FloatingAccentButtonOverlay" >
    <item name="colorAccent">@color/colorFloatingActionBarAccent</item>
</style>

bố cục của bạn xml:

<android.support.design.widget.FloatingActionButton
       android:theme="AppTheme.FloatingAccentButtonOverlay"
       ...
 </android.support.design.widget.FloatingActionButton>

Hmm, có vẻ như điều này sẽ hoạt động, nhưng tôi đang gặp lỗi trình biên dịch trong tệp bố cục String types not allowed (at 'theme' with value 'AppTheme.FloatingAccentButtonOverlay'). Có lẽ tôi đang thiếu một điểm với tệp style.xml ....
Scott Biggie

@ScottBiggs sử dụng android:theme="@style/AppTheme.FloatingAccentButtonOverlay"nhưng solutin này cũng không hoạt động với tôi ...
jpact

Điều gì về API 16 không có thuộc tính coloarAccent?
Duthyant Suthar

12

Tài liệu gợi ý rằng nó lấy màu @ / dấu theo mặc định. Nhưng chúng ta có thể ghi đè lên mã bằng cách sử dụng

fab.setBackgroundTintList(ColorStateList)

Cũng nhớ,

Phiên bản API tối thiểu để sử dụng thư viện này là 15 vì vậy bạn cần cập nhật nó! Nếu bạn không muốn làm điều đó thì bạn cần xác định một tùy chỉnh có thể vẽ và trang trí nó!


hoạt động, nhưng sau đó tôi phải nhắm mục tiêu api 21+. nếu tôi nhắm mục tiêu api 8 không thể gọi phương thức này.
Jjang

Chỉ cần bao gồm thư viện thiết kế này đã được phát hành bởi google "com.android.support:design:22.2.0". Điều này có thể được sử dụng trên các thiết bị là phiên bản không phải kẹo mút! chúc mừng !!
Vijet Badigannavar

tất nhiên là tôi làm, nhưng đây là lỗi ở mã này: Cuộc gọi yêu cầu API cấp 21 (tối thiểu hiện tại là 8): android.widget.ImageView # setBackgroundTintList
Jjang

Phiên bản API tối thiểu để sử dụng thư viện này là 15 vì vậy bạn cần cập nhật nó! Nếu bạn không muốn làm điều đó thì bạn cần xác định một tùy chỉnh có thể vẽ và trang trí nó!
Vijet Badigannavar

Ồ cảm ơn! Tôi không biết, đã nghĩ rằng đó là 21 vì đây là những gì lỗi đã nói. Xin vui lòng gửi đây là một câu trả lời và tôi sẽ chấp nhận nó!
Jjang

10

Thay đổi màu nền của nút hành động nổi bằng cách sử dụng dòng bên dưới

app:backgroundTint="@color/blue"

Thay đổi màu biểu tượng nút hành động nổi

android:tint="@color/white"     

8

Nhờ tự động hoàn thành. Tôi đã gặp may sau một vài lần thử và thử:

    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    card_view:backgroundTint="@color/whicheverColorYouLike"

- hoặc - (cả hai về cơ bản là giống nhau)

    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:backgroundTint="@color/whicheverColorYouLike"

Điều này làm việc cho tôi trên API Phiên bản 17 với thư viện thiết kế 23.1.0.


8

Tôi có cùng một vấn đề và tất cả đều giật tóc tôi. Cảm ơn vì điều này https://stackoverflow.com/a353697105/5228412

Những gì chúng ta có thể làm ..

 favourite_fab.setImageDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.favourite_selected));

nó hoạt động tốt cho tôi và mong muốn cho những người khác sẽ đến đây.


Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Bhargav Rao

8
 <android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    app:elevation="6dp"
    app:backgroundTint="@color/colorAccent"
    app:pressedTranslationZ="12dp"
    android:layout_margin="@dimen/fab_margin"
    android:src="@drawable/add"/>

Lưu ý rằng bạn thêm màu trong res / value / color.xml và bao gồm thuộc tính trong fab của bạn

   app:backgroundTint="@color/addedColor"

8

Với Chủ đề Vật liệu và các thành phần vật liệu FloatingActionButton theo mặc định, nó lấy màu được đặt trong styles.xmlthuộc tính colorSecondary.

  • Bạn có thể sử dụng app:backgroundTintthuộc tính trong xml:
<com.google.android.material.floatingactionbutton.FloatingActionButton
       ...
       app:backgroundTint=".."
       app:srcCompat="@drawable/ic_plus_24"/>
  • Bạn có thể dùng fab.setBackgroundTintList();

  • Bạn có thể tùy chỉnh phong cách của mình bằng cách sử dụng <item name="backgroundTint">thuộc tính

  <!--<item name="floatingActionButtonStyle">@style/Widget.MaterialComponents.FloatingActionButton</item> -->
  <style name="MyFloatingActionButton" parent="@style/Widget.MaterialComponents.FloatingActionButton">
    <item name="backgroundTint">#00f</item>
    <!-- color used by the icon -->
    <item name="tint">@color/...</item>
  </style>
  • bắt đầu từ phiên bản 1.1.0 của các thành phần vật liệu, bạn có thể sử dụng materialThemeOverlaythuộc tính mới để ghi đè các màu mặc định chỉ cho một số thành phần:
  <style name="MyFloatingActionButton" parent="@style/Widget.MaterialComponents.FloatingActionButton">
    <item name="materialThemeOverlay">@style/MyFabOverlay</item>
  </style>

  <style name="MyFabOverlay">
    <item name="colorSecondary">@color/custom2</item>
    <!-- color used by the icon -->
    <item name="colorOnSecondary">@color/...</item>
  </style>

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


7

Ánh xạ thuộc tính chủ đề mới cho Nút hành động nổi trong tài liệu 1.1.0

Trong chủ đề ứng dụng của bạn:

  • Đặt colorSecondary để đặt màu cho nền của FAB (ánh xạ tới nềnTint)
  • Đặt colorOnSecondary để đặt màu cho biểu tượng / văn bản và màu gợn của FAB (ánh xạ thành tint và rippleColor)

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <!-- ...whatever else you declare in your app theme.. -->
    <!-- Set colorSecondary to change background of FAB (backgroundTint) -->
    <item name="colorSecondary">@color/colorSecondary</item>
    <!-- Customize colorSecondary to change icon/text of FAB (maps to tint and rippleColor) -->
    <item name="colorOnSecondary">@android:color/white</item>
</style>

Cuối cùng, một người nào đó cung cấp các giải pháp đơn giản cho màu nền FAB và màu nền trước (biểu tượng).
ManuelTS

5

Khi sử dụng Data Binding, bạn có thể làm một cái gì đó như thế này:

android:backgroundTint="@{item.selected ? @color/selected : @color/unselected}"

Tôi đã làm một ví dụ rất đơn giản


3

Tôi đã làm nó giống như android này: background = "@ color / colorAccent" Tôi chỉ cần vào thư mục res sau đó nhấp vào các giá trị thư mục và sau đó vào colors.xml trong colors.xml Tôi chỉ cần thay đổi màu của colorAccent và gọi nó trong android: background và nó đã xong


2

Điểm chúng tôi thiếu là trước khi bạn đặt màu trên nút, điều quan trọng là phải làm việc với giá trị bạn muốn cho màu này. Vì vậy, bạn có thể đi đến giá trị> màu sắc. Bạn sẽ tìm thấy những cái mặc định, nhưng bạn cũng có thể tạo màu bằng cách ghép và dán chúng, thay đổi màu sắc và tên. Sau đó ... khi bạn đi thay đổi màu của nút nổi (trong Activity_main), bạn có thể chọn cái bạn đã tạo

Ví dụ - mã trên các giá trị> màu với màu mặc định + thêm 3 màu tôi đã tạo:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>

    <color name="corBotaoFoto">#f52411</color>
    <color name="corPar">#8e8f93</color>
    <color name="corImpar">#494848</color>

</resources>

Bây giờ Nút hành động nổi của tôi với màu tôi đã tạo và đặt tên là "corPar":

<android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_input_add"
        android:tint="#ffffff"
        app:backgroundTint="@color/corPar"/>

Nó làm việc cho tôi. Chúc may mắn!


1

Nếu bạn có Nút hành động nổi không có khả năng rút ra, bạn có thể thay đổi tông màu theo chương trình bằng cách sử dụng:

fab.getBackground().mutate().setTint(ContextCompat.getColor(yourContext, R.color.anyColor));

Đó là giải pháp tôi đã tìm kiếm. Tôi đã có một fab đơn giản với backgrountTint và không thể tìm ra cách thay đổi nó theo chương trình cho đến khi tôi tìm thấy nó.
Redar

0

thêm màu vào tệp color.xml

thêm màu trong tệp color.xml và sau đó thêm dòng mã này ... floatingActionButton.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.fab2_color)));


0

Bạn có thể sử dụng mã này trong trường hợp bạn muốn thay đổi màu lập trình

floating.setBackgroundTintList(getResources().getColorStateList(R.color.vermelho));

0

sử dụng

ứng dụng: backgroundTint = "@ color / cam" trong


<com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/id_share_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/share"
        app:backgroundTint="@color/orange"
        app:fabSize="mini"
        app:layout_anchorGravity="end|bottom|center" />



</androidx.coordinatorlayout.widget.CoordinatorLayout>

0

Đối với thiết kế Vật liệu, tôi chỉ thay đổi màu nút hành động nổi như thế này, Thêm hai dòng dưới đây vào nút hành động Nổi xml của bạn. Và thực hiện,

 android:backgroundTint="@color/colorPrimaryDark"
 app:borderWidth="0dp"

0

trong Kotlin:

val gray = getColor(requireContext(), R.color.green)
binding.fabSubmit.backgroundTintList = ColorStateList.valueOf(gray)
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.