[android] 머티리얼 디자인 및 AppCompat가있는 Android의 컬러링 버튼

AppCompat오늘 업데이트가 나오기 전에 Android L의 버튼 색상을 변경할 수 있었지만 이전 버전에서는 불가능했습니다. 새로운 AppCompat 업데이트를 포함시킨 후에는 두 버전의 색상을 변경할 수 없습니다. 버튼을 시도하면 버튼이 사라집니다. 누구든지 버튼 색상을 변경하는 방법을 알고 있습니까?

다음 그림은 내가 달성하고자하는 것을 보여줍니다.

원하는 결과를 보여주는 그림

흰색 버튼이 기본값이며 빨간색 버튼은 내가 원하는 것입니다.

이것은 이전에 버튼의 색상을 변경하기 위해했던 일입니다 styles.xml.

<item name="android:colorButtonNormal">insert color here</item>

그리고 그것을 동적으로하기 위해 :

button.getBackground().setColorFilter(getResources().getColor(insert color here), PorterDuff.Mode.MULTIPLY);

또한 나는에서 테마 부모 변경 한 @android:style/Theme.Material.Light.DarkActionBar로를Theme.AppCompat.Light.DarkActionBar



답변

Support Library rev.22 (2015 년 3 월 13 일 금요일)에서 공식적으로 수정되었습니다. 관련 Google 코드 문제를 참조하십시오.

https://issuetracker.google.com/issues/37008632

사용 예

theme.xml :

<item name="colorButtonNormal">@color/button_color</item>

v21 / theme.xml

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


답변

편집 (2016 년 6 월 22 일) :

원래 응답을 게시 한 후 Appcompat 라이브러리가 재료 버튼을 지원하기 시작했습니다. 이 게시물에서는 올림 버튼과 플랫 버튼을 가장 쉽게 구현할 수 있습니다.

원래 답변 :

해당 AppCompat은 버튼을 지원하지 않기 때문에 xml을 배경으로 사용할 수 있습니다. 그렇게하기 위해 Android의 소스 코드를 살펴보고 스타일링 재료 버튼 관련 파일을 찾았습니다.

1-소스에서 머티리얼 버튼의 원래 구현을보십시오.

안드로이드 소스 코드 에서 btn_default_material.xml을 살펴보십시오 .

파일을 프로젝트 drawable-v21 폴더에 복사 할 수 있습니다. 그러나 여기서 색상 속성을 만지지 마십시오. 변경해야 할 파일이 두 번째 파일입니다.

drawable-v21 / custom_btn.xml

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?attr/colorControlHighlight">
    <item android:drawable="@drawable/btn_default_mtrl_shape" />
</ripple>

2-원본 재질 버튼의 모양 가져 오기

이 드로어 블 안에는 소스 코드의이 파일 에서 찾을 수있는 모양 이 있습니다 .

<inset xmlns:android="http://schemas.android.com/apk/res/android"
   android:insetLeft="@dimen/button_inset_horizontal_material"
   android:insetTop="@dimen/button_inset_vertical_material"
   android:insetRight="@dimen/button_inset_horizontal_material"
   android:insetBottom="@dimen/button_inset_vertical_material">
<shape android:shape="rectangle">
    <corners android:radius="@dimen/control_corner_material" />
    <solid android:color="?attr/colorButtonNormal" />
    <padding android:left="@dimen/button_padding_horizontal_material"
             android:top="@dimen/button_padding_vertical_material"
             android:right="@dimen/button_padding_horizontal_material"
             android:bottom="@dimen/button_padding_vertical_material" />
</shape>

3-재료 버튼의 치수 얻기

그리고이 파일에는 여기에서 찾을 수 있는 파일에서 사용 된 치수가 있습니다 . 전체 파일을 복사하여 폴더에 넣을 수 있습니다 . 모든 버튼에 동일한 크기 (소재 버튼에 사용됨)를 적용 할 때 중요합니다.

4-이전 버전의 다른 드로어 블 파일 만들기

이전 버전의 경우 동일한 이름의 다른 드로어 블이 있어야합니다. 참조하는 대신 직접 항목을 인라인으로 배치하고 있습니다. 당신은 그들을 참조 할 수 있습니다. 그러나 가장 중요한 것은 재료 버튼의 원래 크기입니다.

drawable / custom_btn.xml

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

    <!-- pressed state -->
    <item android:state_pressed="true">
        <inset xmlns:android="http://schemas.android.com/apk/res/android"
            android:insetLeft="@dimen/button_inset_horizontal_material"
            android:insetTop="@dimen/button_inset_vertical_material"
            android:insetRight="@dimen/button_inset_horizontal_material"
            android:insetBottom="@dimen/button_inset_vertical_material">
            <shape android:shape="rectangle">
                <corners android:radius="@dimen/control_corner_material" />
                <solid android:color="@color/PRESSED_STATE_COLOR" />
                <padding android:left="@dimen/button_padding_horizontal_material"
                    android:top="@dimen/button_padding_vertical_material"
                    android:right="@dimen/button_padding_horizontal_material"
                    android:bottom="@dimen/button_padding_vertical_material" />
            </shape>
        </inset>
    </item>

    <!-- focused state -->
    <item android:state_focused="true">
        <inset xmlns:android="http://schemas.android.com/apk/res/android"
            android:insetLeft="@dimen/button_inset_horizontal_material"
            android:insetTop="@dimen/button_inset_vertical_material"
            android:insetRight="@dimen/button_inset_horizontal_material"
            android:insetBottom="@dimen/button_inset_vertical_material">
            <shape android:shape="rectangle">
                <corners android:radius="@dimen/control_corner_material" />
                <solid android:color="@color/FOCUSED_STATE_COLOR" />
                <padding android:left="@dimen/button_padding_horizontal_material"
                    android:top="@dimen/button_padding_vertical_material"
                    android:right="@dimen/button_padding_horizontal_material"
                    android:bottom="@dimen/button_padding_vertical_material" />
            </shape>
        </inset>
    </item>

    <!-- normal state -->
    <item>
        <inset xmlns:android="http://schemas.android.com/apk/res/android"
            android:insetLeft="@dimen/button_inset_horizontal_material"
            android:insetTop="@dimen/button_inset_vertical_material"
            android:insetRight="@dimen/button_inset_horizontal_material"
            android:insetBottom="@dimen/button_inset_vertical_material">
            <shape android:shape="rectangle">
                <corners android:radius="@dimen/control_corner_material" />
                <solid android:color="@color/NORMAL_STATE_COLOR" />
                <padding android:left="@dimen/button_padding_horizontal_material"
                    android:top="@dimen/button_padding_vertical_material"
                    android:right="@dimen/button_padding_horizontal_material"
                    android:bottom="@dimen/button_padding_vertical_material" />
            </shape>
        </inset>
    </item>
</selector>

결과

버튼은 Lollipop 장치에 파급 효과를줍니다. 이전 버전은 잔물결 효과를 제외하고는 정확히 동일한 버튼이 있습니다. 그러나 다양한 상태에 대한 드로어 블을 제공하므로 터치 이벤트 (구식 방식)에도 응답합니다.


답변

이것은 AppCompat 라이브러리 v23.0.0에서 더 많은 테마를 추가하여 향상되었습니다.

Widget.AppCompat.Button.Colored

먼저 appCompat 종속성을 포함하지 않은 경우 포함하십시오.

compile('com.android.support:appcompat-v7:23.0.0') {
    exclude group: 'com.google.android', module: 'support-v4'
}

이제 앱 호환성 v23을 사용해야하므로 SDK-v23도 대상으로 지정해야합니다!

    compileSdkVersion = 23
    targetSdkVersion = 23

당신의 values/theme

<item name="android:buttonStyle">@style/BrandButtonStyle</item>

당신의 values/style

<style name="BrandButtonStyle" parent="Widget.AppCompat.Button.Colored">
    <item name="colorButtonNormal">@color/yourButtonColor</item>
    <item name="android:textColor">@color/White</item>
</style>

당신의 values-v21/style

<style name="BrandButtonStyle" parent="Widget.AppCompat.Button.Colored">
    <item name="android:colorButtonNormal">@color/yourButtonColor</item>
    <item name="android:textColor">@color/White</item>
</style>

버튼 테마가 기본이기 때문에 버튼 Widget.AppCompat.Button.Colored의 텍스트 색상은 기본적으로 흰색입니다!

그러나 버튼을 비활성화하면 문제가있는 것 같습니다. 버튼의 색상이 밝은 회색으로 변경되지만 텍스트 색상은 흰색으로 유지됩니다!

이에 대한 해결 방법은 단추의 텍스트 색상을 흰색으로 구체적으로 설정하는 것입니다! 위의 스타일로 수행 한 것처럼.

이제 버튼을 정의하고 AppCompat이 나머지를 수행하도록 할 수 있습니다. 🙂

<Button
        android:layout_width="200dp"
        android:layout_height="48dp" />

비활성화 된 상태
비활성화 된 상태

활성화 된 상태
활성화 된 상태

편집하다:

추가하려면 <Button android:theme="@style/BrandButtonStyle"/>


답변

Android 지원 라이브러리 22.1.0에서 Google은 Button색조를 인식했습니다. 따라서 버튼의 배경색을 사용자 정의하는 또 다른 방법은 backgroundTint속성 을 사용하는 것입니다.

예를 들어

<Button
       android:id="@+id/add_remove_button"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:backgroundTint="@color/bg_remove_btn_default"
       android:textColor="@android:color/white"
       tools:text="Remove" />


답변

컬러 버튼을 지원하려면 다음과 함께 최신 AppCompat 라이브러리 (> 23.2.1 )를 사용하십시오.

팽창-XML

AppCompat 위젯 :

android.support.v7.widget.AppCompatButton

AppCompat 스타일 :

style="@style/Widget.AppCompat.Button.Colored"

NB! xml에서 사용자 정의 색상을 설정하려면 : app대신 attr :을 사용하십시오.android

(사용 alt+enter또는 선언 xmlns:app="http://schemas.android.com/apk/res-auto"사용으로 app)

app : backgroundTint = “@ color / your_custom_color”

예:

<android.support.v7.widget.AppCompatButton
     style="@style/Widget.AppCompat.Button.Colored"
     app:backgroundTint="@color/your_custom_color"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="Colored Button"/>

또는 프로그래밍 방식으로 설정-JAVA

 ViewCompat.setBackgroundTintList(your_colored_button,
 ContextCompat.getColorStateList(getContext(),R.color.your_custom_color));


답변

최신 지원 라이브러리로 당신은 당신에게 활동을 상속 할 수 AppCompatActivity는 팽창하여 있도록, ButtonAppCompatButton그리고 사용하여 당신에게 레이아웃의 모든 하나의 버튼의 스타일의 색상 수있는 기회를 제공 android:theme="@style/SomeButtonStyle"SomeButtonStyle입니다 :

<style name="SomeButtonStyle" parent="@android:style/Widget.Button">
    <item name="colorButtonNormal">@color/example_color</item>
</style>

2.3.7, 4.4.1, 5.0.2에서 나를 위해 일했습니다.


답변

아래 스타일을 원한다면

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

이 스타일에 버튼을 추가하십시오

style="@style/Widget.AppCompat.Button.Borderless.Colored"

이 스타일을 원한다면

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

아래 코드를 추가

style="@style/Widget.AppCompat.Button.Colored"