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

내 활동에 버튼이 있고 내 테마의 강조 색상을 사용하고 싶습니다. 사전 롤리팝을해야하는 것처럼 내 자신의 드로어 블을 만드는 대신 당연히 새 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)은 정확하고 자동으로 착색됩니다.



답변

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

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

여기에 이미지 설명 입력


답변

나쁜 소식

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’) 모두에서 작동했습니다.


답변

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

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

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

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

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

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

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


답변

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 하나를 사용합니다.


답변

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

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

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


답변

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

여기에 이미지 설명 입력

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


답변

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

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