getColor(int id)はAndroid 6.0 Marshmallow(API 23)では非推奨


719

このResources.getColor(int id)メソッドは廃止されました。

@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
    return getColor(id, null);
}

私は何をすべきか?


26
ContextCompat.getColor(context、R.color.color_name)を使用してください
Ashokchakravarthi Nagarajan

上記のこのメソッドの場合:getColor(context、R.color.your_color); 「コンテキスト」を取得する方法は明確ではありません。私の場合、そこにコンテキストを置くだけでは機能しません、android studio 3.2。これでうまくいくと思います。.setTextColor(Color.RED)。
ハリー、

回答:


1347

Android Support Library 23以降
、新しいgetColor()メソッドがに追加されましたContextCompat

公式JavaDocからの説明:

特定のリソースIDに関連付けられた色を返します

Mから、返される色は、指定されたコンテキストのテーマに合わせてスタイル設定されます。


だから、ただ呼び出す

ContextCompat.getColor(context, R.color.your_color);


ContextCompat.getColor() GitHubでソースコードを確認できます


1
これは解決策のように見えますが、「ここではリソースIDの代わりに解決された色を渡す必要があります」というエラーが発生した場合はどうすればよいですか?私が知る限り、おそらくLintがサポートライブラリの新しいAPIを認識しないためです。おそらく、@ SuppressWarnings( "ResourceAsColor")アノテーションを追加するだけです。私はそれがあまり好きではありません。
スタン

1
こんにちは@Stan、 "ResourceAsColor" Lintをトリガーするメソッド呼び出しをコードスニペットに提供できますか?
araks

「int color = ContextCompat.getColor(this、R.color.orange);」次に「span = new ForegroundColorSpan(color);」。赤の下線が引かれた単語は「色」で、「new ForegroundColorSpan()」に渡します。
Stan

1
@MonicaLabbaoああ...すみません、コメントを誤解しました!:)
araks

3
ContextCompatApi23このマークエラーにより、ContextCompatの参照が疑われました
Webserveis

499

tl; dr:

ContextCompat.getColor(context, R.color.my_color)

説明:

サポートV4ライブラリの一部であるContextCompat.getColor()を使用する必要があります以前のすべてのAPIで機能します)。

ContextCompat.getColor(context, R.color.my_color)

サポートライブラリをまだ使用していない場合はdependencies、アプリ内の配列に次の行を追加する必要がありますbuild.gradle(注:appcompat(V7)ライブラリを既に使用している場合はオプションです)。

compile 'com.android.support:support-v4:23.0.0' # or any version above

テーマに関心がある場合は、ドキュメントで次のように指定されています。

Mから始まり、返された色は、指定されたコンテキストのテーマに合わせてスタイル設定されます


4
これが正解として選択されます。Androidドキュメントの所定のリンクでMから開始して、返された色は指定されたコンテキストのテーマにスタイルが適用されます。
Bugs Happen

1
コンパイル 'com.android.support:appcompat-v7:23.0.1'
G O'Rilla

@G O'Rillaドキュメントでわかるように、ContextCompatクラスはSupportV4から取得されます。AppcompatV7は、SupportV4に依存しているため、機能します。彼らがサポートライブラリのドキュメントで言うように、This library depends on the v4 Support Library. If you are using Ant or Eclipse, make sure you include the v4 Support Library as part of this library's classpath.。だからAppcompatV7答えを入れないのは理にかなっています。
メルビン

1
@Melvinに感謝します。ここに私の使用例を示します。composeTweetAlertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(colorTwitterBlue); composeTweetAlertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(colorTwitterBlue);
Lara Ruffle Coles

1
@メルビン。「色は指定されたコンテキストのテーマにスタイル設定される」とはどういう意味ですか?テーマに応じて、同じカラーIDに異なる色を定義できます。これはどのように正確に行われますか?
RobertoCuba 2017

47

getColorだけのサポートライブラリを含めたくないので、次のようなものを使用しています

public static int getColorWrapper(Context context, int id) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return context.getColor(id);
    } else {
        //noinspection deprecation
        return context.getResources().getColor(id);
    }
}

コードは問題なく機能getColorするはずで、非推奨のものはAPI <23から消えることはありません。

そして、これは私がコトリンで使用しているものです:

/**
 * Returns a color associated with a particular resource ID.
 *
 * Wrapper around the deprecated [Resources.getColor][android.content.res.Resources.getColor].
 */
@Suppress("DEPRECATION")
@ColorInt
fun getColorHelper(context: Context, @ColorRes id: Int) =
    if (Build.VERSION.SDK_INT >= 23) context.getColor(id) else context.resources.getColor(id);

4
ソースコードを見ると、これはまさにサポートライブラリがそれを行う方法です。私は21以上のAPIをターゲットにしているため、これらの数行に完全なjarを含めたくありません。廃止された呼び出しの上に「// noinspection deprecation」を追加することで、Android Studioで警告を抑制できることに注意してください。また、アプリケーションコンテキストではなくアクティビティコンテキストを使用すると、テーマ情報が失われる可能性があります。
personne3000

2
これは正解です。サポートライブラリの方が将来の証拠になる可能性がありますが、サポートライブラリを含める唯一の理由である場合は、これらの2行を含めることをお勧めします。
anthonymonori 2016年

30

Android Marshmallowでは、多くのメソッドが廃止されています。

たとえば、色を使用するには

ContextCompat.getColor(context, R.color.color_name);

また、ドローアブルを使用する

ContextCompat.getDrawable(context, R.drawable.drawble_name);

3
変数のコンテキストはどこから来るのですか?初期化する必要がありますか?動作しません。Androindには長い道のりがあるように思えます。xmlリソースからaf colorを取得するのにどれだけ苦労しているのか、私の心を吹き飛ばします。すごい
ColdTuna 2017年

29

そこにいるすべてのKotlinユーザーの場合:

context?.let {
    val color = ContextCompat.getColor(it, R.color.colorPrimary)
    // ...
}

実際にあるはずですval color = ContextCompat.getColor(context, R.color.colorPrimary)。変数「it」は何でもかまいませんが、Contextである必要があります。
Scott Biggs

itはnullでないかどうかを確認するcontextために使用context?.let {するため、この場合はcontextです。関数getColor()はnull以外のコンテキストのみを受け入れます。詳細letと使用方法については、こちらをご覧ください:kotlinlang.org/docs/reference/scope-functions.html#let
Paul Spiesberger '28

4

KotlinのRecyclerView

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    fun bind(t: YourObject, listener: OnItemClickListener.YourObjectListener) = with(itemView) {
        textViewcolor.setTextColor(ContextCompat.getColor(itemView.context, R.color.colorPrimary))
        textViewcolor.text = t.name
    }
}

1

AndroidサポートライブラリののgetColor(Resources, int, Theme)メソッドを使用しResourcesCompatます。

int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);

あなたが尋ねgetColor(Context, int)ContextCompat時からのあなたの質問よりもあなたの質問をよりよく反映していると思いますResources。APIレベル23より前は、テーマは適用されず、メソッドはを呼び出しgetColor(int)ますが、非推奨の警告は表示されません。テーマもそうかもしれませんnull


1
Theme引数としてnullを渡す場合、返される色は現在のテーマに対してスタイル設定されません。したがって、それは正しくない可能性があります。
2015年


1

あなたの現在の分。APIレベルは23です。getColor()文字列リソースを取得するために使用しているのと同じように使用できますgetString()

//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()

23未満のAPIレベルを制約できます。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    textView.setTextColor(getColor(R.color.green));
} else {
    textView.setTextColor(getResources().getColor(R.color.green));
}

しかし、それを簡単に保つために、受け入れられた答えとして以下のようにすることができます:

textView.setTextColor(ContextCompat.getColor(context, R.color.green))

リソースから

ContextCompat AndroidXから

ContextCompatサポートから


0

私もイライラしました。私の必要性は非常に簡単でした。必要なのはリソースからのARGBカラーだけだったので、簡単な静的メソッドを作成しました。

protected static int getARGBColor(Context c, int resId)
        throws Resources.NotFoundException {

    TypedValue color = new TypedValue();
    try {
        c.getResources().getValue(resId, color, true);
    }
    catch (Resources.NotFoundException e) {
        throw(new Resources.NotFoundException(
                  String.format("Failed to find color for resourse id 0x%08x",
                                resId)));
    }
    if (color.type != TYPE_INT_COLOR_ARGB8) {
        throw(new Resources.NotFoundException(
                  String.format(
                      "Resourse id 0x%08x is of type 0x%02d. Expected TYPE_INT_COLOR_ARGB8",
                      resId, color.type))
        );
    }
    return color.data;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.