色リソースからcolor-intを取得します


447

色リソースからcolor-intを取得する方法はありますか?3つのシークバーの値を特定のレベルに設定できるように、リソース(R.color.myColor)で定義された色の個々の赤、青、緑のコンポーネントを取得しようとしています。

回答:


927

以下を使用できます。

getResources().getColor(R.color.idname);

カスタム色の定義方法については、こちらをご覧ください。

http://sree.cc/google/android/defining-custom-colors-using-xml-in-android

EDIT(1):getColor(int id)は現在非推奨である ため、これを使用する必要があります。

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

(サポートライブラリ23に追加)

編集(2):

以下のコードは、マシュマロの前と後の両方に使用できます(API 23)

ResourcesCompat.getColor(getResources(), R.color.your_color, null); //without theme

ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme

7
android.R.color.some_color :-(についてはどう
Blundell

17
@Blundellええと、今すぐ必要な場合はどうでもいいが、これでも機能するandroid.R.color.some_color例:(getResources().getColor(android.R.color.holo_blue_bright)少なくともAPI 17では)
ataulm

30
getColor()は非推奨になりました。次を使用できます:ContextCompat.getColor(context、R.color.your_color);
Ricardo

2
私はあなたが編集を作られたものではありません実現が、違いは何であるContextCompatとはResourcesCompat?実用的な違いがない場合は、回答から1つを削除すると混乱が少なくなります。
Suragch、2016年

14
なぜGoogleは、このひどいアプリコンパクトライブラリの完全に優れた関数を廃止する必要があると感じているのですか。それは吸う、両方を持っています。
Andrew S

116

新しいAndroidサポートライブラリ(およびこのアップデート)に基づいて、次を呼び出す必要があります。

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

ドキュメントによると:

public int getColor (int id)

このメソッドはAPIレベル23で廃止されました。代わりにgetColor(int、Theme)を使用してください

それは同じソリューションです getResources().getColorStateList(id)

次のように変更する必要があります。

ContextCompat.getColorStateList(getContext(),id);

編集2019

ThemeOverlay最も近いビューのコンテキストの使用について:

val color = ContextCompat.getColor(
  closestView.context,
  R.color.name.color
)

したがって、この方法でThemeOverlayに基づいて適切な色を取得できます。

同じアクティビティで、暗いテーマや明るいテーマなど、さまざまなテーマを使用する場合に特に必要です。テーマとスタイルについてさらに理解を深めたい場合は、このトークをお勧めします:スタイルを使ったテーマの開発

Nick Butcher-Droidcon Berlin-スタイルでテーマを開発する


10
新しい方法でのテーマとして記入するかと思ったものについては、Themeヌルとして渡すことができ、これだけ呼び出すgetColor(R.color.my_color, null)あなたがしているか不明何をテーマに合格する場合。
w3bshark

うーん...これは誰もが言うことですが、私はそれを動作させることができません。コンテキストを初期化する必要がありますか?現在、「シンボル 'コンテキスト'を解決できません」が表示されます
ColdTuna

あなたは右のそれをやっていることを確認するには、コンテキストを取得するよりも、活動ののonCreate内でそれを呼び出してみてください、あなたは「この」だけのgetContext()またはを呼び出す必要があります
Ultimo_m

35

色を定義する

values / color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- color int as #AARRGGBB (alpha, red, green, blue) -->
    <color name="orange">#fff3632b</color>
    ...
    <color name="my_view_color">@color/orange</color>

</resources>

色intを取得して設定します

int backgroundColor = ContextCompat.getColor(context, R.color.my_view_color);
// Color backgroundColor = ... (Don't do this. The color is just an int.)

myView.setBackgroundColor(backgroundColor);

こちらもご覧ください


1
あなただけ使用することができますgetResources()ActivityFragment
Zapnologica

2
@Zapnologica、アクティビティまたはフラグメントの外部での使用に関する考えについては、この質問への回答を参照してくださいgetResources()
Suragch 2015

1
@Zapnologicaいいえ。getResources()コンテキストを実装するものやビューでもパブリックAPIとして利用できます。
ataulm

7

最善のアプローチ

@satが答えるように、色を取得するための良いアプローチは

ResourcesCompat.getColor(getResources(), R.color.your_color, null);

または、getResources()メソッドにアクセスできない場合は、以下の方法を使用します。

Context context  = getContext(); // like Dialog class
ResourcesCompat.getColor(context.getResources(), R.color.your_color, null);

私がすることは

public void someMethod(){
    ...
    ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
}

アプリのどこででも簡単に使用できます!Utilクラスや、ContextまたはgetResource()がないクラスでも

問題(コンテキストがない場合)

アクセス権がないContext場合、あなたのメソッドのようにUtilクラスの。

コンテキストのない以下のメソッドを想定します。

public void someMethod(){
    ...
    // can't use getResource() without Context.
}

次にContext、このメソッドのパラメーターとして渡し、使用しますgetResources().

public void someMethod(Context context){
    ...
    context.getResources...
}

だからここにあなたがのようなどこからでもリソースにアクセスできるボーナスユニークなソリューションがありますUtil class。クラスに追加Resourcesするか、Application存在しない場合は作成してください。

import android.app.Application;
import android.content.res.Resources;

public class App extends Application {
    private static App mInstance;
    private static Resources res;


    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        res = getResources();
    }

    public static App getInstance() {
        return mInstance;
    }

    public static Resources getResourses() {
        return res;
    }

}

manifest.xml <applicationタグに名前フィールドを追加します。(まだ追加されていない場合)

<application
        android:name=".App"
        ...
        >
        ...
    </application>

これで準備完了です。ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);アプリのどこでも使用できます。


5

使用するように更新しました ContextCompat.getColor(context, R.color.your_color);が、(一部のデバイス/ Androidバージョンではわかりません)NullPointerExcepitonが発生することがあります。

したがって、すべてのデバイス/バージョンで機能させるために、ヌルポインターの場合は、古い方法を使用します。

try {
    textView.setTextColor(ContextCompat.getColor(getActivity(), R.color.text_grey_dark));
}
catch(NullPointerException e) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        textView.setTextColor(getContext().getColor(R.color.text_grey_dark));
    }
    else {
        textView.setTextColor(getResources().getColor(R.color.text_grey_dark));
    }
}

すべてのケースで古いバージョンを使用しないのはなぜですか、それともバージョンをチェックしているResources.getColor(int, Theme)場合は、可能であれば新しいAPIを使用してください。ランタイム例外をキャッチしないでください。
ataulm 2016年

ちょうどOCDだと思います。私にとってContextCompatは、それを行う将来の証明方法であり、したがって正しい方法であるように思えます。だから私のアプローチは、それを正しい方法で行うことです。そして、それが失敗した場合(古いデバイスなど)、古い方法で行います。実行時に例外をキャッチしないのはなぜですか?
ninjachippie 2016年

1

この質問を検索結果に表示するのに役立つ別のユースケースの詳細については、リソースで定義されている色にアルファを適用したいと考えていました。

@satの正しい答えを使用する:

int alpha = ... // 0-255, calculated based on some business logic
int actionBarBackground = getResources().getColor(R.color.actionBarBackground);
int actionBarBackgroundWithAlpha = Color.argb(
        alpha,
        Color.red(actionbarBackground),
        Color.green(actionbarBackground),
        Color.blue(actionbarBackground)
);

1

同様に機能する簡単な方法を見つけました:

Color.parseColor(getString(R.color.idname);

興味深いことに、この方法で色を文字列として取得できることに気付きませんでした。私はそれが簡単だとは思わないが、それは😅面白い
ataulm

0

非アクティビティクラスから色にアクセスするのは難しい場合があります。私が見つけた選択肢の1つはを使用することでしたenumenum多くの柔軟性を提供します。

public enum Colors
{
  COLOR0(0x26, 0x32, 0x38),    // R, G, B
  COLOR1(0xD8, 0x1B, 0x60),
  COLOR2(0xFF, 0xFF, 0x72),
  COLOR3(0x64, 0xDD, 0x17);


  private final int R;
  private final int G;
  private final int B;

  Colors(final int R, final int G, final int B)
  {
    this.R = R;
    this.G = G;
    this.B = B;
  }

  public int getColor()
  {
    return (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);
  }

  public int getR()
  {
    return R;
  }

  public int getG()
  {
    return G;
  }

  public int getB()
  {
    return B;
  }
}


0

あなたの現在の分。APIレベルは23です。getColor()私たちが使用しているように単純に使用できますgetString()

//example
textView.setTextColor(getColor(R.color.green));
// if context is not available(ex: not in activity) use with context.getColor()

APIレベル未満が必要な場合は23、これを使用してください:

textView.setTextColor(getResources().getColor(R.color.green));

ただしgetResources().getColor()、APIレベルでは非推奨になっています23。その場合、上記を次のものに置き換えます。

textView.setTextColor(ContextCompat.getColor(this /*context*/, R.color.green)) //Im in an activity, so I can use `this`

ContextCompat:の機能にアクセスするためのヘルパーContext

必要に応じて、SDK_INT以下のように制約できます。

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

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

活動中

ContextCompat.getColor(actvityname.this, R.color.your_color);

断片的に

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

例えば:

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