web-dev-qa-db-ja.com

カラーリソースからcolor-intを取得する

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


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

@ 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)
);
378
ataulm

あなたが使用することができます:

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
818
sat

新しい Androidサポートライブラリ (および this update)に基づいて、今すぐ呼び出す必要があります:

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

ドキュメント :によると

public int getColor (int id)

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

それはgetResources().getColorStateList(id)のための同じ解決策です:

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

ContextCompat.getColorStateList(getContext(),id);
106
Ultimo_m

あなたの色を定義する

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

また見なさい

30
Suragch

私は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));
    }
}
3
ninjachippie

ベストアプローチ

@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のようなどこからでもリソースにアクセスすることができます。 ResourcesApplicationクラスに追加するか、存在しない場合は作成します。

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タグにnameフィールドを追加してください。 (まだ追加されていない場合)

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

今、あなたは行ってもいいです。アプリ内の任意の場所でResourcesCompat.getColor(App.getRes(), R.color.your_color, null);を使用してください。

3
Khemraj

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

0
indrajeet jyoti

ここでの回答は複雑すぎます。サポートライブラリは必要ありません。

API 23(マシュマロ)より前

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

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

チェックを追加すると完了です。

int color = Build.VERSION.SDK_INT<23 ? getResources().getColor(R.color.idname) : getResources().getColor(R.color.idname,null)
0
MattSchmatt

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

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
Confuse