Lollipop의 backgroundTint는 버튼에 영향을주지 않습니다.


82

내 활동에 버튼이 있고 내 테마의 강조 색상을 사용하고 싶습니다. 사전 롤리팝을해야하는 것처럼 내 자신의 드로어 블을 만드는 대신 당연히 새 backgroundTint속성 을 사용하고 싶습니다 .

<Button
    android:id="@+id/btnAddCode"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:backgroundTint="@color/accent"
    android:text="@string/addressInfo_edit_addCode" />

불행히도 효과가 없으며 버튼이 회색으로 유지됩니다.

에 대해 다른 값을 시도했지만 backgroundTintMode아무것도 변경하지 않았습니다.

나는 또한 내 활동에서 프로그래밍 방식으로 시도했지만 아무것도 변경하지 않았습니다.

addCodeView.findViewById(R.id.btnAddCode).setBackgroundTintList(
     getResources().getColorStateList(R.color.accent));

내 색조가 무시되는 이유는 무엇입니까?

편집 : 명확히하기 위해 실제로 Lollipop 장치에서 테스트하고 있습니다. 다른 위젯 (예 : EditText)은 정확하고 자동으로 착색됩니다.


3
이는 향후 릴리스에서 수정 된 버그이지만 승인 된 솔루션은 API 21 이상에서 작동합니다.
— alanv

답변:


18

API 19에서 API 27까지 테스트

<?xml version="1.0" encoding="utf-8"?>
  <android.support.v7.widget.AppCompatButton 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/retry"
    android:textColor="@android:color/white"
    app:backgroundTint="@android:color/holo_red_dark" />

다음과 같이 출력을 생성합니다.

여기에 이미지 설명 입력


몇 년이 지난 지금은 이것이 공식적인 (그리고 최선의) 방법이라고 믿기 때문에 이것을 받아 들인 답변으로 표시했습니다. (사소한 세부 사항 : 대부분의 경우 AppCompatButton 대신 Button을 사용할 수 있으며 여전히 작동합니다).
— BoD

116

나쁜 소식

BoD가 말했듯이 Lollipop 5.0 (API 레벨 21)에서 Button의 배경에 색을 입히는 것은 의미가 없습니다.

좋은 뉴스

Lollipop 5.1 (API 레벨 22)은 btn_mtrl_default_shape.xml (다른 파일 중에서)을 변경하여이 문제를 해결 한 것 같습니다. https://android.googlesource.com/platform/frameworks/base/+/6dfa60f33ca6018959ebff1efde82db7d2aed1e3%5E!/#F0

좋은 소식

새로운 지원 라이브러리 (버전 22.1+)는 이전 버전과 호환 염색 지원 추가 를 포함하여 구성 요소의 많은에 AppCompatButton를 !

불행하게도, android:backgroundTint속성은 아직도 일을 (어쩌면 내가 뭔가 잘못하고 있어요) 않습니다 - 당신은 설정해야하므로 ColorStateList사용하여 코드에서 setSupportBackgroundTintList(). android:backgroundTint앞으로 지원되는 모습을 보면 정말 좋을 것 같습니다. 업데이트 : Marcio Granzotto app:backgroundTint가 AppCompatButton에서 작동하는 댓글을 달았습니다 ! 그것의 것을 참고 app:하지, android:그것을 응용 프로그램 / 라이브러리에 있기 때문에.

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <AppCompatButton
        android:id="@+id/mybutton"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:text="Testing, testing"
        app:backgroundTint="#ff00ff"/>

</LinearLayout>

에서 상속하도록 허용하면 활동이 AppCompatButton정상 대신 자동으로 팽창 Button됩니다 AppCompatActivity.

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AppCompatButton v = (AppCompatButton) findViewById(R.id.mybutton);
        ColorStateList csl = new ColorStateList(new int[][]{new int[0]}, new int[]{0xffffcc00});
        v.setSupportBackgroundTintList(csl);
    }
}

물론 ColorStateList색상 리소스에서 가져와야하지만 나는 게으 르기 때문에 ...

아, 그리고 테마 중 하나를 기반으로 앱 테마를 작성하는 것을 잊지 마십시오 Theme.AppCompat.

이것은 2.3.7 (Gingerbread MR1)과 5.0 (Lollipop 'Classic') 모두에서 작동했습니다.


1
더 많은 정보를 추가했습니다. 가장 중요한 것은 이전에 출시 된 지원 라이브러리의 새 버전 (22.1)을 사용하여 버튼 색조를 얻을 수 있다는 것입니다!
— Snild Dolkow

8
colorButtonNormalAppCompat 22.1.1 (버튼에 대해서만 테마 설정)과 함께 사용할 수 있으며 4.4.4 및 5.1에서 저에게 적합합니다.
— hunyadym

2
TextView에 대해 동일한 것을 설정하는 방법에 대한 아이디어가 있습니까?
— 안드로이드 개발자

8
대신 new ColorStateList(new int[][]{new int[0]}, new int[]{0xffffcc00});더 간결하게 쓸 수 있습니다 ColorStateList.valueOf(0xffffcc00);.
— Ashkan Sarlak 2015

5
는 XML에 backgroundTint : 당신은 응용 프로그램과 함께 android.support.v7.widget.AppCompatButton을 사용할 수 있습니다
— 마르 Granzotto

30

잔물결 드로어 블에 색조를 지정하는 것은 의미가없는 것 같습니다 (그리고 버튼의 기본 배경은 잔물결 드로어 블입니다).

사실, 플랫폼의 기본 버튼 드로어 블을 살펴본 후 "올바른"방법을 찾았습니다. 테마에서 이것을 정의해야합니다.

    <item name="android:colorButtonNormal">@color/accent</item>

(물론 이것은 레벨 21 이상에만 해당됩니다.)

경고 : 이것은 테마에 정의되어 있으므로 모든 버튼 (최소한 해당 테마를 사용하는 활동의 모든 버튼)에 지정된 색상을 사용합니다.

보너스로 다음을 정의하여 잔물결 색상을 변경할 수도 있습니다.

    <item name="android:colorControlHighlight">@color/accent_ripple</item>

colorControlHighlight하지만 다른 많은 위젯을 변경합니다. 해결해 주셔서 감사합니다.
— natario

5
오버레이 테마 (예 : 상위 테마 없음 및 하나의 속성 만 정의 됨)를 정의하고 android : theme 속성을 사용하여 개별보기에이를 적용 할 수 있습니다.
— alanv

1
그렇다면 API 22 이상에서는 어떻게 수정됩니까? 또한이 "버그"는 API 21 (nexus 5, galaxy s3 포함)의 일부 장치에서만 발생합니다
— vedant

22

Android 5.0.x에서 색조와 관련된 문제를 해결하려면 다음과 같이 사용합니다.

public static void setButtonTint(Button button, ColorStateList tint) {
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP && button instanceof AppCompatButton) {
        ((AppCompatButton) button).setSupportBackgroundTintList(tint);
    } else {
        ViewCompat.setBackgroundTintList(button, tint);
    }
}

API 21에 대해서만 지원 방법을 사용하고 다른 모든 경우에는 ViewCompat 하나를 사용합니다.


@Marco 사용 :if (view instanceof TintableBackgroundView) { ((TintableBackgroundView) view).setSupportBackgroundTintList(tint); } else { ViewCompat.setBackgroundTintList(view, tint); }
— chessdork

이것은 롤리팝 이전 장치의 ImageButton에서는 작동하지 않습니다.
— toobsco42

AppCompatButton.setSupportBackgroundTintList ()를 사용할 때 린트 경고가 나타납니다. AppCompatButton.setSupportBackgroundTintList는 동일한 라이브러리 그룹 내에서만 호출 할 수 있습니다 (groupId = com.android.support)
— starkej2

그것은 나를 위해 일했지만 조건을 뒤집어 야했습니다.
— Rodrigo Venancio

"는 같은 라이브러리 그룹 내에서 호출 할 수 있습니다 (의 groupId = com.android.support"왜이 경고?
— 페란 Negre

22

나는 보통 PorterDuff를 사용하여 동적으로 수행합니다.

mbutton = (Button) findViewById(R.id.mybutton);
mbutton.getBackground().setColorFilter(anycolor, PorterDuff.Mode.MULTIPLY);

서로 다른 혼합 모드를 확인할 수 있습니다 여기에 좋은 예 여기를 .


1
나는 PorterDuff.Mode.SRC를 사용하고 그것을 완벽하게 작동
— francisco_ssb

완벽하게 작동합니다. 제 경우에는 API 17에 색조 효과를 사용하고 싶었습니다.
— ashishdhiman2007

2
이것은 받아 들여진 대답이어야합니다. API 20 작업을 확인하십시오.
— hardanger

19

app:backgroundTint대신 사용 android:backgroundTint하면 Lollipop 아래에서 색조가 적용됩니다. 그 이유는 AppCompatActivity사용 AppCompatViewInflaterAppCompatButton 또는 AppCompatTextView로 자동 변경 버튼 또는 텍스트 뷰를 선택한 다음 app:backgroundTint적용됩니다.

여기에 이미지 설명 입력

내 프로젝트에서 나는 그것을 사용했습니다.


9

나는 당신이 일을 android:background하기 위해 준비 해야한다고 생각 android:backgroundTint한다.

좀 더 정확하게 말하면, 내 생각 backgroundTint에 RippleDrawable.


1
나는 당신이 맞다고 생각합니다. 사실 나는 내가 원하는 것을하는 "올바른"방법을 찾았다 (내 대답 참조).
— BoD

3

유사한 문제가 Google https://code.google.com/p/android/issues/detail?id=201873 에서보고되었습니다.

하지만 Android 지원 라이브러리, 개정판 23.2.1 (2016 년 3 월) 출시 후이 버그가 해결되었습니다.

문제 : FloatingActionButton.setBackgroundTintList (@Nullable ColorStateList tint)가 더 이상 배경색을 변경하지 않습니다.

지원 라이브러리를 다음으로 업데이트 Android Support Library to 23.2.1

디자인 지원 라이브러리 ( 23.2.1 ) 및 appcompatwidgets 를 아래와 같이 사용하십시오.

사전 롤리팝 장치를위한 머티리얼 디자인 :

AppCompat (일명 ActionBarCompat)는 Gingerbread에서 실행되는 기기를위한 Android 4.0 ActionBar API의 백 포트로 시작하여 백 포트 된 구현 및 프레임 워크 구현 위에 공통 API 레이어를 제공합니다. AppCompat v21은 Android 5.0에서 최신 API 및 기능 세트를 제공합니다.


Android 지원 라이브러리 22.1 :

AppCompat를 사용할 때 자동으로 위젯에 색조를 지정하는 기능은 앱 전체에서 강력한 브랜딩과 일관성을 유지하는 데 매우 유용합니다. 이것은 레이아웃을 부 풀릴 때 자동으로 수행됩니다. Button을 AppCompatButton으로, TextView를 AppCompatTextView로 대체하여 각각이 색조를 지원할 수 있는지 확인합니다. 이번 릴리스에서 이러한 색조 인식 위젯은 이제 공개적으로 사용할 수 있으므로 지원되는 위젯 중 하나를 하위 클래스로 분류해야하는 경우에도 색조 지원을 유지할 수 있습니다.



2

지원 라이브러리의 소스 코드를 살펴보면 일반적으로 알려진 버튼의 색조가 표시되지만 버튼의 모양을 변경하면 (둥근 버튼이 있습니다) 색조가 api <= 21에서 제대로 작동하지 않습니다. 또한 TintManager가 공개 클래스 (appcompat-v7 : 23.1.1)가되었으므로 현재 테마의 기본 버튼 모양 (5.0에서는 괜찮음)에서 ColorStateList를 가져올 수 있으므로 배열을 만들 필요가 없습니다. 색상) :

    Context c = ...; // activity
    AppCompatButton ab = ...; // your button
    // works ok in 22+:
    if (Build.VERSION.SDK_INT <= 21) {
        // default appcompat button, that is tinted ok with current theme colors "abc_btn_default_mtrl_shape":
        // ColorStateList tint = TintManager.get(c).getTintList(R.drawable.abc_btn_default_mtrl_shape);
        // Appcompat 23.2 change:
        ColorStateList tint = AppCompatDrawableManager.get().getTintList(c, R.drawable.abc_btn_default_mtrl_shape);
        ab.setSupportBackgroundTintList(tint);
        }

APPCOMPAT 23.2 이후 그들은 (공공 불구하고!) 클래스를 변경 TintManager -> AppCompatDrawableManager 코드 숙박 거의 같은
— 파벨 Biryukov

WTF ... getTintList 공개에서 지금 보호로 변경 (필요 : 사용 반사
— 파벨 Biryukov

0

속성 backgroundTint은 API 레벨 21 이상에서만 사용 되기 때문에


나는 그것을 알고 있으며 실제로 Lollipop 장치에서 테스트하고 있습니다. 이를 명확히하기 위해 질문을 업데이트하겠습니다.
— 이사회

0

recyclerview에서 가장 많이 업데이트 된 lib도이 버그를 일으킬 수 있습니다.

이 명령

  sendBtnView.setBackgroundTintList(colorState)

과거에는 완벽하게 일했지만 나를 위해 일하지 마십시오. 조사 후 원인은 gradle 종속성에 추가 된 lib입니다.

  compile 'com.android.support:recyclerview-v7:+'

그래서 여기 Amit Vaghela 게시물에서 권장 한대로 23.02.1로 변경하려고했습니다. 나는 변했다

  compile  'com.android.support:recyclerview-v7:23.02.1'

그러나 gradle 오류는 recyclerview lib 에이 버전 (23.02.1)이 없다고 말했습니다 (gradle은 Jcenter raw.github 또는 repo에서 찾을 수 없음).

그런 다음 내가 gradle 종속성에있는 다른 모든 libs에서 버전 22.02.0 '으로 과거에 잘 작동하는 데 사용 된 setBackgroundTintList 명령을 알고 있었기 때문입니다. 그래서 다음과 같이 변경합니다.

compile   'com.android.support:recyclerview-v7:22.02.0'

이제 다시 작동합니다.


0

이것이 권장되는지 확실하지 않지만 시도해 볼 수 있습니다.

Drawable newDrawable = mBtnAction.getBackground();  // obtain Bg drawable from the button as a new drawable
DrawableCompat.setTint(newDrawable, mActivity.getHomeTobBarBGColor());  //set it's tint
mBtnAction.setBackground(newDrawable);  //apply back to button

일반적으로 작동합니다. 시도 ViewCompat했지만 제대로 작동하지 않는 것 같습니다.


0

버전 backgroundTint <android.support.design.button.MaterialButton과 함께 사용할 수 있습니다."com.android.support:design:28.0.0-rc01"


0

androidx를 사용하는 경우 접두사가 붙은 버전과 접두사가없는 버전을 모두 추가하면 android 5.1에서 문제가 해결되었습니다.

<style name="Button_Primary">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:backgroundTint">@color/button_primary_selector</item>
    <item name="backgroundTint">@color/button_primary_selector</item><!--needed for android 5-->
</style>

button_primary 선택기는 color다음 내용 이있는 폴더에 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:local="http://schemas.android.com/apk/res-auto">
    <item android:state_enabled="true" android:color="@android:color/holo_blue_dark" />
    <item android:state_enabled="false" android:color="@android:color/darker_gray" />
</selector>

일반 버튼에 적용 AppCompatActivity

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