プログラムでボタンの色合いを追加する方法


118

新しい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:backgroundTintがプレロリポップに取り組んでいますか?ButtonとApCompatButtonの両方でテストしましたが、backgroundTintはLollipopでのみ機能しているようです。
Sharj 2015

回答:


161

ドキュメントによると、関連するメソッドandroid:backgroundTintsetBackgroundTintList(ColorStateList list)です

更新

このリンククリックして、カラー状態リストリソースの作成方法を確認してください。

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

contextInstanceインスタンスはContext


AppCompartの使用

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

これは色ではなく、ColorStateListです。それを活用するには?
ステファン

4
おかげで今はそれを行う方法がわかりますが、なぜAndroidでは色を手動で使用することができないのですか?私が持っているすべてのボタンのすべての色について、ColorStateListのxmlを作成する必要がありますか?それは私にとって無駄のようです
ステファン

2
AppCompatButtonで呼び出す場合でも、setBackgroundTintListにはAPI 21が必要です。
シャルジ

29
AppCompatサポートライブラリは静的ヘルパーを提供ViewCompat.setBackgroundTintList(View, ColorStateList)します。これはAPI 4までずっと使用できますがTintableBackgroundView、たとえばAppCompatButton(通常のの代わりにButton)を実装するビューでのみ機能します。
ジョンアダムス

1
ViewCompat.setBackgroundTintList(View, ColorStateList)@Jon Adamsが示唆したように、View.setSupportButtonTintListはRestrictTo注釈で制限されているため、を使用することはさらに意味があります。詳細はこちら:developer.android.com/reference/android/support/annotation/...
AlexKost

75

あなたは使うことができます

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

このブログの投稿で詳細を確認できます(「描画可能な色付け」のセクションを参照)。


2
urメソッドを使用して色合いを設定するための完全なコードを提供できますか?
M. Usman Khan 2016

ベストアンサー...!
Gokul Nath KP

60

ビューにはティント管理のための独自のメカニズムがあるようですので、ティントリストを追加するほうがよいでしょう。

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

この方法を使用すると、API 4からの下位互換性が得られます。
xarlymg89

最高のソリューションの1つ。
Atif AbbAsi

20

実際のコード状況を提供して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);

このソリューションは、ドローアブルがボタンの背景として使用されるシナリオ用です。Lollipop以前のデバイスでも動作します。


@TruptiNasit聞いてよかったです。
Shayne3000 2018

私のために働いた。ありがとうございました。
ウェズリーフランク

1
@wesleyfranksどういたしまして。それがうまくいったと聞いてうれしい。
Shayne3000

7

このようなことを試しましたか?

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

getResources()はアクティビティでのみ機能することに注意してください。しかし、すべてのコンテキストで呼び出すこともできます。


ここで説明するように、XMLを作成することができます。developer.android.com/reference/android/content/res/...
クリスK.

getColorStateListは廃止される予定です。
cloudsurfin

1
setBackgroundTintListはAPIレベル21を必要とするようです
Nashe

1
ボタン。setBackgroundTintList(ContextCompat.getColorStateList(context、R.color.blue)); 私のために働いた
jesto paul


5

あなたはDrawableCompatを使用することができます例えば

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

5

これは、マテリアルデザインライブラリの新しいマテリアルボタンで簡単に処理できます。最初に、依存関係を追加します。

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

テキストの色合い自体にも同様のものはありますか?
Android開発者

ボタンとしてのテキストを意味し、背景の色を変更したいですか?
アミンKeshavarzian

4

私がどうにかして私を働かせた方法は、を使用することでしたCompoundButtonCompat.setButtonTintList(button, colour)

私の理解では、これはAndroidのバージョンに関係なく機能します。


3

同様の問題がありました。色(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>

お役に立てれば。


2
最低限必要なAPIレベル21
forsberg、2017

まああなたはただ使うことができますColorStateList.valueOf(ColorInt)
user924

2

ImageButtonの場合、次を使用できます。

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

ボタンにはsetColorFilterが定義されていません
ジェレミー'22

ImageButtonの場合です。
Saurabh Singh

ああ、私はそれについて知りませんでした。しかし、OPはボタンを求めています。この詳細で回答を編集して、反対票を削除できますか?
ジェレミー2018

2

とを使用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)

1

Shayne3000の回答に加えて、カラーリソース(intカラーだけでなく)も使用できます。Kotlinバージョン:

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

0

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からのbackgroundTintとして使用すると、android 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:AndroidのすべてのAPIバージョンでテーマ化されたリソースを解決する必要がある場合は、-ContextCompat- ではなくAppCompatResourcesを使用します。

このトピックの詳細については、この記事を参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.