Android Değişen Yüzen Eylem Düğmesi rengi


531

Materyal'in Yüzen Eylem Düğmesi rengini değiştirmeye çalışıyorum, ancak başarılı olamadım.

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

Eklemeye çalıştım:

android:background="@color/mycolor"

veya kod yoluyla:

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

veya

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

Fakat yukarıdakilerin hiçbiri işe yaramadı. Önerilen yinelenen sorudaki çözümleri de denedim, ancak hiçbiri çalışmıyor; düğme yeşil kaldı ve aynı zamanda bir kare oldu.

PS Ayrıca dalgalanma efekti eklemek bilmek güzel olurdu, bunu da anlayamadık.



Dalgalanma efekti yeni bir RenderThread kullandığı için lolipop öncesi cihazlarda mevcut değildir .
tachyonflux

@karaokyo tamam ama nasıl yapıyorum?
Jjang

27
Google, bu şeyleri erişilebilir hale getirmek için bence gerçekten kötü bir iş yapıyor
Joop

Bunu programlı ve geriye dönük uyumlu yapmak için bkz. Stackoverflow.com/questions/30966222/…
Ralph Pina

Yanıtlar:


1049

Açıklandığı gibi belgeler , varsayılan olarak renk kümesini alır styles.xml nitelik colorAccent .

Bu görünümün arka plan rengi, temanızın colorAccent varsayılanıdır. Bunu çalışma zamanında değiştirmek isterseniz, bunu setBackgroundTintList (ColorStateList) ile yapabilirsiniz.

Rengi değiştirmek isterseniz

  • uygulamasında XML'de : 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" >
  • .setBackgroundTintList ile kod içinde (aşağıda ywwynm tarafından cevap )

@ Dantalian'ın yorumlarda belirtildiği gibi, Tasarım Destek Kütüphanesi için simge rengini v22'ye (dahil) değiştirmek isterseniz,

android:tint="@color/white"     

V23'ten bu yana Tasarım Destek Kütüphanesi için şunları kullanabilirsiniz:

app:tint="@color/white"   

Ayrıca androidXkütüphanelerde xml düzeninizde 0dp kenarlığı ayarlamanız gerekir:

<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
Bu, <API 12 aygıtları için Tasarım Destek Kitaplığı v23'te çalışmaz. V22'de çalışıyordu, görünüşe göre bir şey kırdılar.
hungryghost

4
Örneğin, görüntü rengini de beyaza dönüştürmek istiyorsanız şunu kullanabilirsiniz: android: tint = "@ android: color / white"
Dancalian

1
android: tint = "@ color / white" benim için çalışmadı çünkü bir nedenden dolayı çözemedi. android: tint = "# ffffff" Yine de benim için çalışıyor
realappie

2
Bunun nedeni, color.xml dosyasında @ color / white öğesinin bulunmamasıdır. @android: color / white kullanın veya beyaz ya da ihtiyacınız olan her şeyi adlandırın
Dantalian

227
"app: backgroundTint" değil "android: backgroundTint" kullanın
Vasil Valchev

244

Vijet Badigannavar'ın cevabı doğru ama ColorStateListkullanımı genellikle karmaşık ve bize nasıl yapılacağını söylemedi. Sık sık Viewrengini normal ve basılı durumda değiştirmeye odaklandığımız için daha fazla ayrıntı ekleyeceğim:

  1. FAB'S rengini normal durumda değiştirmek istiyorsanız, sadece yazabilirsiniz

    mFab.setBackgroundTintList(ColorStateList.valueOf(your color in int));
  2. Eğer FABbasılı renkte rengini değiştirmek istiyorsanız , Tasarım Destek Kütüphanesi 22.2.1 için teşekkürler ,

    mFab.setRippleColor(your color in int);

    Bu özelliği ayarladığınızda, tuşuna uzun süre bastığınızda, FABrenk noktanızda bir dalgalanma temas noktanızda görünecek ve tüm yüzeyinde ortaya çıkacaktır FAB. Lütfen FABnormal durumda renginin değişmeyeceğini unutmayın . API 21'in (Lollipop) altında dalgalanma efekti yoktur, ancak FABbastığınızda renk hala değişecektir.

Son olarak, durumlar için daha karmaşık bir etki uygulamak istiyorsanız, o zaman derinlemesine araştırmalısınız ColorStateList, işte tartışan bir SO sorusu: ColorStateList'i programlı olarak nasıl oluşturabilirim? .

GÜNCELLEME: @ Kaitlyn'nin yorumu için teşekkürler. Color olarak backgroundTint kullanarak FAB konturunu kaldırmak app:borderWidth="0dp"için xml'nizde ayarlayabilirsiniz .


3
Bunun için teşekkürler, ColorStateList'in nasıl kullanılacağını bilmiyordum. Bununla birlikte, kodunuz FAB'mi tema vurgu renginin konturuyla (anahat) bırakır. Bu konturu nasıl kaldırabileceğime (ya da rengini değiştirebileceğime) ve özel renkte vurgu rengine benzeyen özel bir renkte bir FAB'ye sahip olduğum hakkında bir fikrin var mı?
Kaitlyn Hanrahan

@KaitlynHanrahan Lütfen güncellememe bakın. Yorumun için teşekkürler.
ywwynm

Bu mükemmel çalışıyor - Lollypop ve Kitkat aynı görünüyor, hatta her ikisi de küçük gölgeleme var, bu yüzden FAB arka planda aynı renge karşı çıkıyor (Kısmen Araç Çubuğu üzerinde var). Çok teşekkürler! Çok basit ama bunu kendi başıma bulabilir miyim bilmiyorum.
Kaitlyn Hanrahan

app:borderWidthProgramlı olarak ayarlamanın bir yolu var mı ? Teşekkürler
Štarke

@ Štarke Kaynak koduna baktıktan sonra FloatingActionButton, şu anda programcı olarak ayarlayamayacağınızdan korkuyorum mBorderWidth.
ywwynm

123

As Vasil Valchev yorumunda belirtildiği göründüğünden daha basittir, ama benim XML fark olmadığını ince bir fark vardır.

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

Dikkat edin:

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

ve değil

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

7
Bu durum, bu birbirinden tamamen farklı iki şey vardır çünkü önemlidir: android:backgroundTint=""arasındadır Api düzeyinde 21 Lollipop Malzeme Tasarım ve kısmen ve Lollipop altında göz ardı edilecektir. Ayrıca FABdüz bir renk olmadığı için rengi tamamen değiştirmez . Çalıştırmak için birini kullanmalısınız app:.
creativecreatorormaybenot

1
Teşekkürler, kullanarak android:coloruygulamamın çökmesine neden oldu ve bu beni deli ediyordu! Uygulamamı ve akıl sağlığımdan
geriye kalanları sakladığınız için teşekkürler

@Kapenaar sorun değil, fark etmeden önce de bir süre başımı kaşıyordu;)
HenriqueMS

Java tarafında XML'de app: ve android:
marienke

@marienke bir ColorStatesList ile ayarlayabilir, yeni bir soru gönderebilir ve cevaplayabilmem için bağlantıyı buraya gönderebilirsiniz;)
HenriqueMS

58

Eğer uygulamayı kullanarak FAB rengini değiştirmeye çalışırsanız, bazı sorun var. düğmenin çerçevesi farklı renklere sahiptir, bu yüzden yapmanız gerekenler:

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

ve kodda rengi ayarlayın:

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

2
Bu normal renkler için çalışır. # 44000000 gibi alfa rengi verirsem, çerçeve rengi sorunu yeniden üretilebilir.
Dinesh

5
getResources.getColor () kullanımdan kaldırıldı, ContextCompat.getColor (bağlam, renginiz) kullanmayı düşünün; yerine. Umarım yardımcı olur
Tinashe Chinyanga

51

sadece kullan,

app:backgroundTint="@color/colorPrimary"

kullanma,

android:backgroundTint="@color/colorPrimary"

hmmmm bu neden android stüdyo otomatik tamamlama sonuç vermek android kullanın: backgroundTint, bu cevap verry iyi
Yudi karma

31

FAB size göre renklendirilir colorAccent.

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

Varsayılan renk yeşil değil. Yeşil rengi nerede belirlediniz?
tachyonflux

1
Yapmadım. Gördüğünüz gibi, bu xml düğmenin düzenini ayarladığım tek yer ...
Jjang

Belki de sadece FAB ile yeni bir proje oluşturmalı ve her şeyin kodunu yazmalısınız.
tachyonflux

3
Vay canına ... Temelde sizden sadece aynı şeyi yapmanızı istedim ve siz bunu yapmaya istekli değildiniz. Kodunuzun yeterli olduğuna inanmanız oldukça ikiyüzlüdür, ancak kodunuza eklemem yeterli değildir. MCVE oluşturmak askere düşüyor . Teşekkürler.
tachyonflux

2
Artık, Tema Özelliği Eşleme Yüzen Eylem Düğmesini Eşleme'ye (şimdi kendimi doğruladım) dayalı olarak colorSeincil ( com.google.android.material: malzeme: 1.1.0-alpha02 )
ievgen

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

Bu, en kolay çözümdür, özel bir çekilebilir kullanmaktan çok daha kolaydır.
IgorGanapolsky

16

Diğer çözümler işe yarayabilir. Bu ve benzeri durumlarda geniş ölçüde uygulanabilir olma avantajına sahip 10 kiloluk goril yaklaşımı budur:

Styles.xml:

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

düzeniniz xml:

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

Hmm, bunun çalışması gerektiği gibi görünüyor, ancak düzen dosyasında derleyici hataları alıyorum String types not allowed (at 'theme' with value 'AppTheme.FloatingAccentButtonOverlay'). Belki styles.xml ile bir noktayı kaçırıyorum ....
Scott Biggs

@ScottBiggs kullanıyorum android:theme="@style/AppTheme.FloatingAccentButtonOverlay"ama bu solutin her iki şekilde benim için çalışmıyor ...
jpact

ColoarAccent atrribute özelliği olmayan API 16'ya ne dersiniz?
Dushyant Suthar

12

Belge, varsayılan olarak @ color / accent değerini aldığını gösterir. Ancak kodu kullanarak kodu geçersiz kılabiliriz

fab.setBackgroundTintList(ColorStateList)

Ayrıca unutmayın,

Bu kütüphaneyi kullanmak için minimum API sürümü 15'tir, bu yüzden güncellemeniz gerekir! Bunu yapmak istemiyorsanız, özel bir çekilebilir tanımlamanız ve dekore etmeniz gerekir!


çalışır, ama sonra api 21+ hedeflemeliyim. api 8'i hedeflersem bu yöntemi çağıramazsınız.
Jjang

Google "com.android.support:design:22.2.0" tarafından yayınlanan bu tasarım kütüphanesini eklemeniz yeterli. Bu lolipop olmayan versiyonlarda kullanılabilir! şerefe !!
Vijet Badigannavar

Tabii ki yapıyorum, ancak bu koddaki hata budur: Çağrı API seviye 21 gerektirir (şu anki min 8): android.widget.ImageView # setBackgroundTintList
Jjang

Bu kütüphaneyi kullanmak için minimum API sürümü 15'tir, bu yüzden güncellemeniz gerekir! Bunu yapmak istemiyorsanız, özel bir çekilebilir tanımlamanız ve dekore etmeniz gerekir!
Vijet Badigannavar

Oh teşekkürler! Bilmiyordum, 21 olduğunu düşündüm çünkü hatanın söylediği buydu. Lütfen bunu bir cevap olarak gönderin ve kabul edeceğim!
Jjang

10

Aşağıdaki satırı kullanarak Kayan eylem düğmesi arka plan rengini değiştirme

app:backgroundTint="@color/blue"

Kayan eylem düğmesi simge rengini değiştirme

android:tint="@color/white"     

8

Otomatik tamamlama sayesinde. Birkaç vuruş ve denemeden sonra şanslıydım:

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

- veya - (her ikisi de temelde aynı şeydir)

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

Bu benim için tasarım kütüphanesi 23.1.0 ile API Sürüm 17'de çalıştı.


8

Aynı problemi aldım ve hepsi saçımı kaptı. Bunun için teşekkürler https://stackoverflow.com/a/35697105/5228412

Ne yapabiliriz..

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

benim için iyi çalışıyor ve buraya ulaşacak başkalarına diliyorum.


Bu teorik olarak soruyu cevaplayabilse de , cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantı sağlamak tercih edilir.
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"/>

Res / değerleri / color.xml dosyasına renk eklediğinizi ve özelliği

   app:backgroundTint="@color/addedColor"

8

İle Malzeme Tema ve malzeme bileşenlerinin FloatingActionButton varsayılan olarak ayarlanan renk alır styles.xmlöznitelik colorSecondary.

  • Bu app:backgroundTintözniteliği xml içinde kullanabilirsiniz :
<com.google.android.material.floatingactionbutton.FloatingActionButton
       ...
       app:backgroundTint=".."
       app:srcCompat="@drawable/ic_plus_24"/>
  • Kullanabilirsiniz fab.setBackgroundTintList();

  • <item name="backgroundTint">Özelliğini kullanarak stilinizi özelleştirebilirsiniz

  <!--<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>
  • malzeme bileşenlerinin 1.1.0 sürümünden başlayarak yeni materialThemeOverlayözelliği yalnızca bazı bileşenler için varsayılan renkleri geçersiz kılmak için kullanabilirsiniz :
  <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>

resim açıklamasını buraya girin


7

Malzeme 1.1.0'daki Kayan İşlem Düğmesi için yeni tema özellik eşlemesi

Uygulama temanızda:

  • FAB'nin arka planı için bir renk ayarlamak üzere colorSeincil öğesini ayarlayın (backgroundTint ile eşleşir)
  • FAB'ın simge / metin ve dalgalanma rengi için bir renk ayarlamak üzere colorOnSeincil öğesini ayarlayın (renk tonu ve dalgalanma renkleri ile eşleşir)

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

Son olarak FAB arka plan ve ön plan (simge) renkleri için basit çözümler sunan biri.
ManuelTS


3

Ben bu android gibi yaptım: background = "@ color / colorAccent" Ben sadece klasör res gidin sonra klasör değerleri ve sonra colors.xml in colors.xml sadece colorAccent rengini değiştirmek ve android: arka plan olarak adlandırmak ve bitti


2

Eksik olduğumuz nokta, düğmedeki rengi ayarlamadan önce, bu renk için istediğiniz değer üzerinde çalışmak önemlidir. Böylece değerler> renk'e gidebilirsiniz. Varsayılan olanları bulacaksınız, ancak renkleri kopyalayıp yapıştırarak, renkleri ve adları değiştirerek de renkler oluşturabilirsiniz. Ardından ... kayan düğmenin rengini değiştirmeye gittiğinizde (etkinlik_alanında), oluşturduğunuz düğmeyi seçebilirsiniz

Örnek - değerler üzerindeki kod> varsayılan renklerle renkler + oluşturduğum 3 renk daha:

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

Şimdi oluşturduğum ve "corPar" adını verdiğim renk ile Yüzer Eylem Düğmem:

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

Benim için çalıştı. İyi şanslar!


1

Çekilebilir olmayan bir Yüzen Eylem Düğmeniz varsa, tonu programlı olarak aşağıdakileri kullanarak değiştirebilirsiniz:

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

Aradığım çözüm bu. Ben backgrountTint ile basit bir fab vardı ve bunu bulana kadar programlı olarak değiştirmek için bir yol bulamadık.
Redar

0

color.xml dosyasına renk ekleme

color.xml dosyasına renkler ekleyin ve ardından bu kod satırını ekleyin ... floatingActionButton.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.fab2_color)));


0

Rengi programlı olarak değiştirmek istemeniz durumunda bu kodu kullanabilirsiniz

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

0

kullanım

app: backgroundTint = "@ renk / turuncu"


<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

Malzeme tasarımı için, kayan eylem düğmesi rengini böyle değiştirdim, Kayan eylem düğmenize xml'ye aşağıdaki iki satırı ekleyin. Ve bitti,

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

0

Kotlin'de:

val gray = getColor(requireContext(), R.color.green)
binding.fabSubmit.backgroundTintList = ColorStateList.valueOf(gray)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.