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한다.

좀 더 정확하게 말하면, 내 생각 backgroundTintRippleDrawable.


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.