このResources.getColor(int id)
メソッドは廃止されました。
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
私は何をすべきか?
このResources.getColor(int id)
メソッドは廃止されました。
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
私は何をすべきか?
回答:
Android Support Library 23以降
、新しいgetColor()メソッドがに追加されましたContextCompat
。
公式JavaDocからの説明:
特定のリソースIDに関連付けられた色を返します
Mから、返される色は、指定されたコンテキストのテーマに合わせてスタイル設定されます。
だから、ただ呼び出す:
ContextCompat.getColor(context, R.color.your_color);
ContextCompat.getColor()
GitHubでソースコードを確認できます。
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から始まり、返された色は、指定されたコンテキストのテーマに合わせてスタイル設定されます
M
、「から開始して、返された色は指定されたコンテキストのテーマにスタイルが適用されます。」
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
答えを入れないのは理にかなっています。
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);
Android Marshmallowでは、多くのメソッドが廃止されています。
たとえば、色を使用するには
ContextCompat.getColor(context, R.color.color_name);
また、ドローアブルを使用する
ContextCompat.getDrawable(context, R.drawable.drawble_name);
そこにいるすべてのKotlinユーザーの場合:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary)
。変数「it」は何でもかまいませんが、Contextである必要があります。
it
はnullでないかどうかを確認するcontext
ために使用context?.let {
するため、この場合はcontext
です。関数getColor()
はnull以外のコンテキストのみを受け入れます。詳細let
と使用方法については、こちらをご覧ください:kotlinlang.org/docs/reference/scope-functions.html#let
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
}
}
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
。
リソースが必ずしも必要でない場合は、次を使用しますparseColor(String)
。
Color.parseColor("#cc0066")
あなたの現在の分。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))
リソースから。
私もイライラしました。私の必要性は非常に簡単でした。必要なのはリソースからの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;
}