Android에서 플로팅 액션 버튼 색상 변경


531

머티리얼의 플로팅 액션 버튼 색상을 변경하려고했지만 성공하지 못했습니다.

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

나는 추가하려고 노력했다 :

android:background="@color/mycolor"

또는 코드를 통해 :

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

또는

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

그러나 위의 어느 것도 효과가 없었습니다. 또한 제안 된 중복 질문에서 해결책을 시도했지만 그중 아무것도 작동하지 않습니다. 버튼은 녹색으로 유지되었고 정사각형이되었습니다.

추신 : 잔물결 효과를 추가하는 방법을 아는 것도 좋을 것입니다.



롤리팝 이전의 장치에서는 새로운 RenderThread를 사용하므로 잔물결 효과를 사용할 수 없습니다 .
tachyonflux 2016 년

@karaokyo ok하지만 어떻게하고 있습니까?
Jjang

27
구글은 제 생각에 이러한 것들을 실현 가능하게 만들기 위해 정말 나쁜 일을합니다
Joop

프로그래밍 방식 및 역 호환성을 위해이 작업을 수행하려면 stackoverflow.com/questions/30966222/…
Ralph Pina

답변:


1049

문서에 설명 된대로 기본적으로 styles.xml 속성 colorAccent에 설정된 색상이 사용됩니다 .

이보기의 배경색은 테마의 colorAccent로 기본 설정됩니다. 런타임에이를 변경하려면 setBackgroundTintList (ColorStateList)를 통해 변경할 수 있습니다.

색상을 변경하려면

  • app : backgroundTint 속성을 가진 XML로
<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 (아래의 답변을 ywwynm )

의견에서 @Dantalian이 언급했듯이 Design Support Library의 아이콘 색상 을 v22 (포함) 로 변경하려면 다음을 사용할 수 있습니다

android:tint="@color/white"     

v23 이후의 디자인 지원 라이브러리의 경우 다음을 사용할 수 있습니다.

app:tint="@color/white"   

또한 androidX라이브러리를 사용하면 XML 레이아웃에서 0dp 테두리를 설정해야합니다.

<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
<API 12 디바이스 용 디자인 지원 라이브러리 v23에서는 작동하지 않습니다. 그것은 v22에서 작동하고 있었기 때문에 분명히 무언가를 부 ke습니다.
hungryghost

4
예를 들어 이미지 색상을 흰색으로 변경하려면 android : tint = "@ android : color / white"
Dantalian

1
android : tint = "@ color / white"는 어떤 이유로 든 해결할 수 없기 때문에 작동하지 않았습니다. android : tint = "# ffffff"그래도 작동합니다
realappie

2
colors.xml에 @ color / white가 없기 때문입니다. @android : color / white를 사용하거나 흰색 또는 원하는 색상을 만드십시오
Dantalian

227
"android : backgroundTint"가 아닌 "app : backgroundTint"사용
Vasil Valchev 8

244

Vijet Badigannavar의 답변은 정확하지만 사용 ColorStateList은 일반적으로 복잡하며 사용 방법을 알려주지 않았습니다. 우리는 종종 View정상 상태와 압축 상태에서 색상 을 변경하는 데 집중하기 때문에 더 자세한 내용을 추가 할 것입니다.

  1. FAB정상 상태에서 색상 을 변경하려면 다음 과 같이 작성하면됩니다.

    mFab.setBackgroundTintList(ColorStateList.valueOf(your color in int));
  2. PressedFAB 상태에서 색상 을 변경하려면 Design Support Library 22.2.1 덕분에 작성하면됩니다.

    mFab.setRippleColor(your color in int);

    이 속성을 설정하면을 길게 누르면 FAB색상이있는 잔물결이 터치 포인트에 나타나고의 전체 표면에 나타납니다 FAB. FAB정상적인 상태에서는 색상이 변경되지 않습니다 . API 21 (Lollipop) 아래에서는 잔물결 효과 FAB가 없지만를 누르면 색상이 계속 변경됩니다.

마지막으로, 상태에 대해 더 복잡한 효과를 구현하려면을 깊이 파고 들어야합니다. 다음 ColorStateList은 SO 질문입니다. 프로그래밍 방식으로 ColorStateList를 어떻게 작성합니까? .

업데이트 : @Kaitlyn의 의견에 감사드립니다. backgroundTint를 색상으로 사용하여 FAB의 획을 제거하려면 app:borderWidth="0dp"xml에서 설정할 수 있습니다 .


3
이 덕분에 ColorStateList를 사용하는 방법을 몰랐습니다. 그러나 코드에서 테마 강조 색상의 획 (개요)으로 FAB를 떠납니다. 그 획을 제거하거나 색상을 변경하는 방법을 알고 있습니까? 특별한 색상이 강조되는 특수 색상의 FAB를 가지고 있습니까?
Kaitlyn Hanrahan

@KaitlynHanrahan 내 업데이트를 참조하십시오. 귀하의 의견에 감사드립니다.
ywwynm

완벽하게 작동합니다. Lollypop과 Kitkat는 동일하게 보입니다. 모두 음영이 거의 없어서 FAB이 백그라운드에서 동일한 색상으로 튀어 나옵니다 (부분적으로 툴바 위에 있음). 정말 고마워! 간단하지만 직접 찾은 것인지 모르겠습니다.
Kaitlyn Hanrahan

app:borderWidth프로그래밍 방식 으로 설정하는 방법이 있습니까? 감사합니다
Štarke

@ Štarke 글쎄,의 소스 코드를 살펴본 후에 FloatingActionButton대한 setter가 없으므로 프로그래밍 방식으로 설정할 수 없습니다 mBorderWidth.
ywwynm

123

으로 바실 Valchev이 코멘트에서 언급이보기보다 간단하지만 내 XML에 몰래되지 않았 음을 미묘한 차이가있다.

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

다음과 같습니다.

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

그리고 아닙니다

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

7
이것들은 완전히 다른 두 가지이기 때문에 중요합니다 : Api 레벨 21android:backgroundTint="" 에서 왔으며 Lollipop Material Design의 일부이며 Lollipop 아래에서 무시됩니다. 또한 FAB단색이 아니기 때문에 색상이 완전히 바뀌지 않습니다. app:작동 하려면 하나 를 사용해야합니다 .
creativecreatoror은 (는)

1
고마워, 사용하면 android:color내 앱이 중단되어 견딜 수 없었습니다! 내 앱을 저장 해주셔서 감사합니다. 내 정신 남은 부분 ;-)
Kapenaar

@Kapenaar 문제 없음, 알아 차리기 전에 잠시 동안 내 머리를 긁적;)
HenriqueMS

자바 측에서 XML에서 app : 및 android :와 같은 차이점이 없기 때문에 프로그래밍 방식으로 어떻게 작동합니까?
marienke

@marienke 당신은 ColorStatesList로 설정할 수 있고, 새로운 질문을 게시하고 여기에 링크를 게시하여 대답 할 수 있습니다;)
HenriqueMS

58

앱을 사용하여 FAB의 색상을 변경하려고하면 몇 가지 문제가 있습니다. 버튼의 프레임은 색상이 다르므로 수행해야 할 작업 :

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

코드에서 색상을 설정하십시오.

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

2
이것은 정상적인 색상에 적용됩니다. # 44000000과 같은 알파 색상을 주면 프레임 색상 문제를 재현 할 수 있습니다.
Dinesh

5
getResources.getColor ()는 더 이상 사용되지 않습니다. ContextCompat.getColor (context, your colour); 대신에. 도움이
되길 바랍니다

51

그냥 사용하세요

app:backgroundTint="@color/colorPrimary"

사용하지 마십시오

android:backgroundTint="@color/colorPrimary"

흠 mmmm 원인이 안드로이드 스튜디오 자동 완성 결과를 사용하십시오 android : backgroundTint,이 답변 verry good
Yudi karma

31

FAB는에 따라 색상이 지정됩니다 colorAccent.

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

기본 색상은 녹색이 아닙니다. 녹색을 어디에 설정 했습니까?
tachyonflux

1
나는하지 않았다. 보시다시피,이 xml은 버튼의 레이아웃을 설정하는 유일한 장소입니다.
Jjang

FAB만으로 새 프로젝트를 만들고 전체 코드를 게시해야 할 수도 있습니다.
tachyonflux

3
와우 ... 난 기본적으로 똑같은 일을하라고했지만 기꺼이하지 않았다. 코드가 충분하지만 코드에 추가 한 것이 적절하지 않다고 생각하는 것은 위선적입니다. MCVE 를 만드는 것은 실수에 빠진다 . 감사.
tachyonflux

2
더 이상, 테마 속성 매핑을 기반으로 하는 유동 액션 버튼 (지금 확인)은 colorSecondary ( com.google.android.material : material : 1.1.0-alpha02 )로 표시됩니다.
ievgen


16

다른 솔루션이 작동 할 수 있습니다. 이것은 10 파운드 고릴라 방식으로 이와 유사한 경우에 광범위하게 적용 할 수있는 이점이 있습니다.

Styles.xml :

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

레이아웃 XML :

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

흠, 이것이 작동하는 것처럼 보이지만 레이아웃 파일에 컴파일러 오류가 발생합니다 String types not allowed (at 'theme' with value 'AppTheme.FloatingAccentButtonOverlay'). 아마 styles.xml ..에서 요점을 잃어 버릴 수 있습니다.
Scott Biggs

@ScottBiggs 사용 android:theme="@style/AppTheme.FloatingAccentButtonOverlay"하지만이 solutin은 나에게 어느 쪽도 작동하지 않습니다 ...
jpact

coloarAccent 속성이없는 API 16은 어떻습니까?
Dushyant Suthar

12

이 문서는 기본적으로 @ color / accent를 사용하도록 제안합니다. 그러나 우리는 코드를 사용하여 그것을 재정의 할 수 있습니다

fab.setBackgroundTintList(ColorStateList)

또한 기억하십시오

이 라이브러리를 사용하는 최소 API 버전은 15이므로 업데이트해야합니다! 당신이 그것을하고 싶지 않다면 사용자 정의 드로어 블을 정의하고 장식해야합니다!


작동하지만 API 21 이상을 타겟팅해야합니다. api 8을 대상으로하면이 메소드를 호출 할 수 없습니다.
Jjang

Google "com.android.support:design:22.2.0"에서 출시 한이 디자인 라이브러리 만 포함하십시오. 롤리팝 버전이 아닌 장치에서 사용할 수 있습니다! 건배!!
Vijet Badigannavar 2016 년

물론,하지만이 코드의 오류입니다 : 호출에는 API 레벨 21이 필요합니다 (현재 최소값은 8입니다) : android.widget.ImageView # setBackgroundTintList
Jjang

이 라이브러리를 사용하는 최소 API 버전은 15이므로 업데이트해야합니다! 당신이 그것을하고 싶지 않다면 사용자 정의 드로어 블을 정의하고 장식해야합니다!
Vijet Badigannavar

오 감사! 나는 이것이 오류라고 말한 이후 21이라고 생각했습니다. 답변으로 게시 해 주시면 동의하겠습니다.

10

아래 줄을 사용하여 플로팅 동작 버튼 배경색 변경

app:backgroundTint="@color/blue"

플로팅 동작 버튼 아이콘 색상 변경

android:tint="@color/white"     

8

자동 완성 덕분입니다. 몇 번의 타격과 시련 끝에 운이 좋았습니다.

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

-또는-(둘 다 기본적으로 동일 함)

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

이것은 디자인 라이브러리 23.1.0이있는 API 버전 17에서 나를 위해 일했습니다.


8

나는 같은 문제와 그것의 모든 것이 내 머리를 때리고있다. https://stackoverflow.com/a/35697105/5228412 감사합니다

우리가 할 수있는 일

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

그것은 나를 위해 잘 작동하고 여기에 도달 할 다른 사람들을 바랍니다.


이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다.
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 / values ​​/ color.xml에 색상을 추가하고 팹에 속성을 포함시킵니다.

   app:backgroundTint="@color/addedColor"

8

으로 재료 테마시약 FloatingActionButton 기본적으로는 설정 색상 소요 styles.xml속성을 colorSecondary.

  • app:backgroundTintxml 에서 속성을 사용할 수 있습니다 .
<com.google.android.material.floatingactionbutton.FloatingActionButton
       ...
       app:backgroundTint=".."
       app:srcCompat="@drawable/ic_plus_24"/>
  • 당신이 사용할 수있는 fab.setBackgroundTintList();

  • <item name="backgroundTint">속성을 사용하여 스타일을 사용자 정의 할 수 있습니다

  <!--<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>
  • 재료 구성 요소 버전 1.1.0 부터 새로운 materialThemeOverlay속성을 사용하여 일부 구성 요소에 대해서만 기본 색상을 재정의 할 수 있습니다 .
  <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>

여기에 이미지 설명을 입력하십시오


7

머티리얼 1.1.0의 플로팅 액션 버튼 에 대한 새로운 테마 속성 매핑

앱 테마에서 :

  • FAB의 배경색을 설정하려면 colorSecondary 설정 (backgroundTint에 매핑)
  • FAB의 아이콘 / 텍스트 및 잔물결 색상의 색상을 설정하려면 colorOnSecondary를 설정합니다 (틴트 및 잔물결 색상으로 매핑).

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

마지막으로 FAB 배경 및 전경 (아이콘) 색상에 대한 간단한 솔루션을 제공하는 사람입니다.
ManuelTS

5

데이터 바인딩 을 사용할 때 다음과 같은 작업을 수행 할 수 있습니다.

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

나는 매우 간단한 예를 만들었습니다


3

나는이 android : background = "@ color / colorAccent"와 같이 그것을했다. 폴더 res로 가서 폴더 값을 클릭 한 다음 colors.xml의 colors.xml을 클릭하면 colorAccent의 색상을 변경하고 android에서 호출한다 : background 그리고 그 일


2

우리가 놓친 요점은 버튼의 색상을 설정하기 전에이 색상에 원하는 값으로 작업하는 것이 중요하다는 것입니다. 따라서 값> 색상으로 이동할 수 있습니다. 기본 색상을 찾을 수 있지만 색상과 이름을 변경하여 복사하여 붙여 넣어 색상을 만들 수도 있습니다. 그런 다음 ... activity_main에서 부동 버튼의 색상을 변경하면 만든 색상을 선택할 수 있습니다

예-값에 대한 코드> 기본 색상이있는 색상 + 내가 만든 3 가지 색상 더 :

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

이제 만들었고 "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"/>

그것은 나를 위해 일했다. 행운을 빕니다!


1

드로어 블이없는 플로팅 액션 버튼이있는 경우 다음을 사용하여 프로그래밍 방식으로 색조를 변경할 수 있습니다.

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

그게 내가 찾던 해결책입니다. backgrountTint가있는 간단한 팹이 있었고 이것을 찾을 때까지 프로그래밍 방식으로 변경할 수 없었습니다.
Redar

0

color.xml 파일에 색상 추가

color.xml 파일에 색상을 추가 한 다음이 코드 줄을 추가하십시오. floatingActionButton.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.fab2_color)));


0

프로그래밍 방식으로 색상을 변경하려는 경우이 코드를 사용할 수 있습니다

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

0

사용하다

app : backgroundTint = "@ color / orange"


<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

머티리얼 디자인의 경우, 방금 플로팅 액션 버튼 색상을 다음과 같이 변경했습니다. 플로팅 액션 버튼 xml에 아래 두 줄을 추가하십시오. 그리고 완료

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

0

코 틀린에서 :

val gray = getColor(requireContext(), R.color.green)
binding.fabSubmit.backgroundTintList = ColorStateList.valueOf(gray)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.