프로그래밍 방식으로 단추 색조를 추가하는 방법


120

새로운 AppCompat 라이브러리에서 다음과 같이 버튼에 색조를 지정할 수 있습니다.

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/follow"
    android:id="@+id/button_follow"
    android:backgroundTint="@color/blue_100"
    />

내 코드에서 프로그래밍 방식으로 버튼의 색조를 어떻게 설정할 수 있습니까? 기본적으로 일부 사용자 입력을 기반으로 버튼의 조건부 색상을 구현하려고합니다.


android : backgroundTint가 Pre-Lollipop에서 작동하고 있습니까? Button과 ApCompatButton으로 테스트하지만 backgroundTint는 Lollipop에서만 작동하는 것 같습니다.
Sharj 2015-04-23

답변:


162

문서 에 따르면 관련 메서드 android:backgroundTintsetBackgroundTintList (ColorStateList list)입니다.

최신 정보

링크 를 따라 색상 상태 목록 리소스를 만드는 방법을 알아보십시오.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="#your_color_here" />
</selector>

그런 다음

setBackgroundTintList(contextInstance.getResources().getColorStateList(R.color.your_xml_name));

contextInstance의 인스턴스는 어디에 있습니까Context


AppCompart 사용

btnTag.setSupportButtonTintList(ContextCompat.getColorStateList(Activity.this, R.color.colorPrimary));

이것은 색상이 아니라 ColorStateList입니다. 그것을 활용하는 방법?
Stephane

4
감사합니다. 이제 Android에서 색상을 수동으로 사용하는 것을 허용하지 않는 이유는 무엇입니까? 내가 가진 모든 버튼의 모든 색상에 대해 ColorStateList에 대한 xml을 만들어야합니까? 그것은 나에게 낭비처럼 보인다
Stephane

2
setBackgroundTintList는 AppCompatButton에서 호출하더라도 API 21이 필요합니다.
Sharj 2015-04-23

29
AppCompat 지원 라이브러리는 ViewCompat.setBackgroundTintList(View, ColorStateList)API 4까지 다시 사용할 수 있는 정적 도우미를 제공합니다 . 그러나 TintableBackgroundView예를 들어 AppCompatButton(일반적인 대신) 를 구현하는보기에서만 작동합니다 Button.
Jon Adams

1
이제 ViewCompat.setBackgroundTintList(View, ColorStateList)@Jon Adams가 제안한대로를 사용 하면 View.setSupportButtonTintList가 RestrictTo주석 으로 제한되므로 훨씬 더 의미가 있습니다. 여기에 세부 정보 : developer.android.com/reference/android/support/annotation/…
AlexKost

75

당신은 사용할 수 있습니다

button.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.id.blue_100)));

하지만 어제 출시 된 지원 라이브러리 드로어 블 틴팅을 사용하는 것이 좋습니다.

Drawable drawable = ...;

// Wrap the drawable so that future tinting calls work
// on pre-v21 devices. Always use the returned drawable.
drawable = DrawableCompat.wrap(drawable);

// We can now set a tint
DrawableCompat.setTint(drawable, Color.RED);
// ...or a tint list
DrawableCompat.setTintList(drawable, myColorStateList);
// ...and a different tint mode
DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_OVER);

이 블로그 게시물에서 자세한 내용 확인할 수 있습니다 ( "Drawable tinting"섹션 참조).


2
ur 방법을 사용하여 색조를 설정하는 완전한 코드를 제공 할 수 있습니까?
M. Usman Khan

베스트 답변 ...!
Gokul Nath KP

60

뷰는 색조 관리를위한 자체 메커니즘을 가지고있는 것처럼 보이므로 색조 목록을 추가하는 것이 좋습니다.

ViewCompat.setBackgroundTintList(
    editText, 
    ColorStateList.valueOf(errorColor));

이런 식으로 사용하는 것이 훨씬 더 좋으므로 API 4에서 하위 호환성을 얻을 수 있습니다!
xarlymg89

최고의 솔루션 중 하나입니다.
Atif AbbAsi

21

실제 코드 상황을 제공하여 dimsuz의 답변을 올바르게 확장하려면 다음 코드 스 니펫을 참조하십시오.

    Drawable buttonDrawable = button.getBackground();
    buttonDrawable = DrawableCompat.wrap(buttonDrawable);
    //the color is a direct color int and not a color resource
    DrawableCompat.setTint(buttonDrawable, Color.RED);
    button.setBackground(buttonDrawable);

이 솔루션은 드로어 블이 버튼의 배경으로 사용되는 시나리오를위한 것입니다. 롤리팝 이전 기기에서도 작동합니다.


@TruptiNasit 다행입니다.
Shayne3000

나를 위해 일했습니다. 감사합니다.
웨슬리는 프랭크

1
@wesleyfranks 천만에요. 효과가 있었다 니 다행입니다.
Shayne3000 jul

7

이런 식으로 시도해 보셨습니까?

button.setBackgroundTintList(getResources().getColorStateList(R.id.blue_100));

getResources ()는 활동에서만 작동합니다. 그러나 모든 상황에서도 호출 할 수 있습니다.


여기에 설명 된대로는 XML을 만들 수 있습니다 developer.android.com/reference/android/content/res/...
크리스 K.

getColorStateList가 더 이상 사용되지 않는 것 같습니다.
cloudsurfin

1
API 레벨 21 요구하는 것 setBackgroundTintList
하기 Nashe

1
단추. setBackgroundTintList (ContextCompat.getColorStateList (context, R.color.blue)); 나를 위해 일
제 스토 폴


5

DrawableCompat를 사용할 수 있습니다.

public static Drawable setTint(Drawable drawable, int color) {
    final Drawable newDrawable = DrawableCompat.wrap(drawable);
    DrawableCompat.setTint(newDrawable, color);
    return newDrawable;
}

5

머티리얼 디자인 라이브러리의 새로운 머티리얼 버튼에서 쉽게 처리 할 수 ​​있습니다. 먼저 종속성을 추가하세요.

implementation 'com.google.android.material:material:1.1.0-alpha07'

그런 다음 XML에서 버튼에 다음을 사용하십시오.

<com.google.android.material.button.MaterialButton
    android:id="@+id/accept"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/i_accept"
    android:textSize="18sp"
    app:backgroundTint="@color/grayBackground_500" />

색상을 변경하고 싶을 때 Kotlin의 코드는 더 이상 사용되지 않으며 Android 21 이전에 사용할 수 있습니다.

accept.backgroundTintList = ColorStateList.valueOf(ResourcesCompat.getColor(resources, 
R.color.colorPrimary, theme))

텍스트 색조 자체에 유사한 것이 있습니까?
안드로이드 개발자

버튼으로 텍스트를 의미하고 배경 색상을 변경하고 싶습니까?
Amin Keshavarzian 19

4

내 작업을 수행하는 방법은 CompoundButtonCompat.setButtonTintList(button, colour).

내 이해에 이것은 안드로이드 버전에 관계없이 작동합니다.


3

비슷한 문제가있었습니다. 색상 (int) 값을 기반으로 뷰에 대한 복잡한 드로어 블 배경에 색상을 지정하고 싶었습니다. 코드를 사용하여 성공했습니다.

ColorStateList csl = new ColorStateList(new int[][]{{}}, new int[]{color});
textView.setBackgroundTintList(csl);

여기서 color는 필요한 색상을 나타내는 int 값입니다. 이것은 간단한 xml ColorStateList를 나타냅니다.

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:color="color here"/>
</selector>

도움이 되었기를 바랍니다.


2
최소 요구 API 레벨 21
forsberg

잘 사용할 수 있습니다ColorStateList.valueOf(ColorInt)
user924

2

ImageButton의 경우 다음을 사용할 수 있습니다.

favoriteImageButton.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint

단추에 대해 setColorFilter가 정의되지 않았습니다
Jérémy

그것은 ImageButton입니다.
Saurabh Singh

아 그래, 몰랐어. 그러나 OP는 Button을 요구합니다. 내 반대표를 제거 할 수 있도록이 세부 정보로 답변을 편집 할 수 있습니까?
Jérémy

2

Kotlin및 을 사용하는 경우 다음 과 같이 Material Design색상을 변경할 수 있습니다 MaterialButton.

myButton.background.setTintList(ContextCompat.getColorStateList(context, R.color.myColor))

MaterialButton코드를 더 읽기 쉽고 코딩을 좀 더 편리하게 만들기 위해 확장 함수를 만들어서 더 향상시킬 수 있습니다 .

fun MaterialButton.changeColor(color: Int) {
    this.background.setTintList(ContextCompat.getColorStateList(context, color))
}

그런 다음 다음과 같이 모든 곳에서 함수를 사용할 수 있습니다.

myButton.changeColor(R.color.myColor)

1

Shayne3000 의 답변 외에도 색상 리소스 (정수 색상뿐만 아니라)를 사용할 수도 있습니다. Kotlin 버전 :

var indicatorViewDrawable = itemHolder.indicatorView.background
indicatorViewDrawable = DrawableCompat.wrap(indicatorViewDrawable)
val color = ResourcesCompat.getColor(context.resources, R.color.AppGreenColor, null) // get your color from resources
DrawableCompat.setTint(indicatorViewDrawable, color)
itemHolder.indicatorView.background = indicatorViewDrawable

0

XML 기반 색상 상태 목록이 테마 속성을 참조하는 경우 여기에 제안 된 답변이 Android 5.0에서 제대로 작동하지 않습니다. 예를 들어 다음과 같은 xml 색상 상태 목록이 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="?colorPrimary" android:state_enabled="true"/>
    <item android:alpha="0.12" android:color="?attr/colorOnSurface"/>
</selector>

이것을 xml의 backgroundTint로 사용하면 안드로이드 5.0과 다른 모든 것에서 잘 작동합니다. 그러나 다음과 같은 코드에서 이것을 설정하려고하면 :

(이러지 마세요)

myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));

실제로 Activity 또는 버튼의 컨텍스트를 ContextCompat.getColorStateList () 메서드에 전달하는지 여부는 중요하지 않으며 버튼이있는 테마와 관련하여 적절한 색상 상태 목록을 제공하지도 않습니다. 이는 색상 상태 목록에서 테마 속성을 사용하는 것이 api 23과 ContextCompat가이를 해결하기 위해 특별한 작업을 수행하지 않을 때까지 지원되지 않았기 때문입니다. 대신 장치 <API 23에서 자체 리소스 구문 분석 / 테마 속성 확인 을 수행하는 AppCompatResources.getColorStateList () 를 사용해야합니다 .

대신 다음을 사용해야합니다.

myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));

TLDR : Android의 모든 API 버전에서 해결 된 테마 리소스가 필요한 경우 -ContextCompat-가 아닌 AppCompatResources를 사용 합니다.

주제에 대한 자세한 내용 은이 문서를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.