programing

프로그래밍 방식으로 버튼 틴트를 추가하는 방법

javamemo 2023. 9. 12. 19:46
반응형

프로그래밍 방식으로 버튼 틴트를 추가하는 방법

새 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:backgroundTintis setBackgroundTintList(ColorStateList)

갱신하다

링크를 따라 색상 상태 목록 리소스를 만드는 방법을 확인합니다.

<?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));

어디에contextInstanceA의 한 예입니다.Context


AppCompart 사용하기

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

당신은 사용할 수 있습니다.

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);

자세한 내용은 이 블로그 게시물에서 확인할 수 있습니다("그림으로 그릴 수 있는 선팅" 섹션 참조).

보기에는 틴트 관리를 위한 자체 메커니즘이 있는 것 같습니다. 그래서 틴트 리스트를 두는 것이 더 좋을 것 같습니다.

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

코틀린으로 하는 방법은 다음과 같습니다.

view.background.setTint(ContextCompat.getColor(context, textColor))

실제 코드 상황을 제공하여 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);

이 솔루션은 단추의 배경으로 드로잉이 사용되는 시나리오에 대한 것입니다.롤리팝 이전 기기에서도 작동합니다.


간단한 방법은

자바어로

myButton.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.id.white)));

코틀린에서

myButton.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.id.white)))

이런 거 먹어봤어요?

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

getResources()는 활동에서만 작동합니다.하지만 그것은 모든 맥락에서 또한 호출될 수 있습니다.

재료 설계 라이브러리의 새로운 재료 버튼에서 쉽게 처리할 수 있습니다. 먼저 종속성을 추가합니다.

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))

Drawable Compate를 사용할 수 있습니다. 예를 들어,

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

제가 일을 시작할 수 있었던 방법은CompoundButtonCompat.setButtonTintList(button, colour).

안드로이드 버전에 상관없이 작동하는 것으로 알고 있습니다.

다음과 같은 것을 사용할 수 있습니다.

myButton.backgroundTintList = AppCompatResources.getColorStateList(context, R.color.primary_variant)

저도 비슷한 문제가 있었습니다.저는 색상(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>

도움이 되길 바랍니다.

사용하시는 경우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)

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

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

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의 Tint는 안드로이드 5.0과 다른 모든 것에서 잘 작동합니다.그러나 이 코드를 다음과 같이 설정하려고 하면 다음과 같습니다.

(이러지마)

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

활동이나 단추의 컨텍스트를 ContextCompat.getColorStateList() 메서드로 전달해도 상관이 없으며, 단추 안에 있는 테마에 대한 적절한 색상 상태 목록을 제공하지 않습니다.이는 api 23 및 ContextCompat가 이러한 문제를 해결하기 위해 특별한 기능을 수행하지 않을 때까지 색상 상태 목록에서 테마 속성을 사용하는 것이 지원되지 않았기 때문입니다.대신 장치 < API 23에서 자체 리소스 파싱/테마 특성 확인을 수행하는 AppCompatResources.getColorStateList()사용해야 합니다.

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

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

TLDR: 안드로이드의 모든 API 버전에서 해결된 테마 리소스가 필요하다면 -ContextCompat가 아닌 AppCompat Resources를 사용합니다.

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

Shayne3000의 답변 외에 색상 리소스(int 색상뿐 아니라)도 사용할 수 있습니다.코틀린 버전:

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

Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ setBackgroundTintList

int myColor = Color.BLACK;
  1. button.setBackgroundTintList(new ColorStateList(EMPTY, new int[] { myColor }));
  2. button.setBackgroundTintList(ColorStateList.valueOf(myColor));
  3. button.setBackgroundTintList(contextInstance.getResources().getColorStateList(R.color.my_color));

다른 버전의 안드로이드를 신경쓰지 않으려면 기본적으로 모든 보기를 위해 이 코드를 사용할 수 있습니다.나를 위해 일했습니다.

val states = arrayOf(intArrayOf(android.R.attr.state_enabled))
                    val colors = intArrayOf(Color.GREEN) // your color here
                    val colorStateList = ColorStateList(states, colors)
                  ViewCompat.setBackgroundTintList(yourButtonHere,colorStateList)

코틀린 버전, 이 글을 읽는 모든 사람들에게 좋은 하루가 되길 바랍니다 ;)

그건 그렇고. 만약 당신이 그릴 수 있는 배경 모양을 만들었다면 이것은 틴트 색상만 덮어쓸 것입니다.

checkbox.ButtonTintList = ColorStateList.ValueOf(Android.Color.White);

사용하다ButtonTintList에 대신에BackgroundTintList

다음과 같이 단추에 틴트를 추가할 수 있습니다.

filterBtn.setBackgroundTintList(ContextCompat.getColorStateList(context,R.color.colorPrimary))

이미지 뷰를 위해 사용할 수 있는 단순한

    imageView.setColorFilter(ContextCompat.getColor(context,
R.color.COLOR_YOUR_COLOR));

백그라운드 틴트에서 HTML 컬러 코드를 설정하는 방법을 알고 싶은 사람이 있는 경우(컬러 코드가 백엔드에서 오는 경우)

String htmlColorCode = "#FF0000";
int colorInt = Color.parseColor(htmlColorCode);
View myView = findViewById(R.id.my_view);
ViewCompat.setBackgroundTintList(myView, ColorStateList.valueOf(colorInt));

코틀린이랑.

checkbox.buttonTintList = AppCompatResources.getColorStateList(context, color.colorPrimary)

언급URL : https://stackoverflow.com/questions/29801031/how-to-add-button-tint-programmatically

반응형