プログラムでTextView
のテキストの色を?android:textColorPrimary
にプログラムで設定するにはどうすればよいですか?
以下のコードを試しましたが、textColorPrimaryとtextColorPrimaryInverseの両方でテキストの色が常に白に設定されています(どちらも白ではないので、XMLで確認しました)。
TypedValue typedValue = new TypedValue();
Resources.Theme theme = getActivity().getTheme();
theme.resolveAttribute(Android.R.attr.textColorPrimaryInverse, typedValue, true);
int primaryColor = typedValue.data;
mTextView.setTextColor(primaryColor);
最後に、次のコードを使用して、テーマのプライマリテキストの色を取得しました-
// Get the primary text color of the theme
TypedValue typedValue = new TypedValue();
Resources.Theme theme = getActivity().getTheme();
theme.resolveAttribute(Android.R.attr.textColorPrimary, typedValue, true);
TypedArray arr =
getActivity().obtainStyledAttributes(typedValue.data, new int[]{
Android.R.attr.textColorPrimary});
int primaryColor = arr.getColor(0, -1);
属性がresourceまたはcolor valueに解決されたかどうかを確認する必要があります。
textColorPrimaryのデフォルト値はColorではなく、ColorStateListであり、これはresourceです。
@ColorInt public static int resolveColorAttr(Context context, @AttrRes int colorAttr) {
TypedValue resolvedAttr = resolveThemeAttr(context, colorAttr);
// resourceId is used if it's a ColorStateList, and data if it's a color reference or a hex color
int colorRes = resolvedAttr.resourceId != 0 ? resolvedAttr.resourceId : resolvedAttr.data;
return ContextCompat.getColor(context, colorRes);
}
public static TypedValue resolveThemeAttr(Context context, @AttrRes int attrRes) {
Theme theme = context.getTheme();
TypedValue typedValue = new TypedValue();
theme.resolveAttribute(attrRes, typedValue, true);
return typedValue;
}
使用法:
@ColorInt int color = resolveColorAttr(context, Android.R.attr.textColorPrimaryInverse);
Kotlinの拡張バージョン
@ColorInt
fun Context.getColorResCompat(@AttrRes id: Int): Int {
val resolvedAttr = TypedValue()
this.theme.resolveAttribute(id, resolvedAttr, true)
val colorRes = resolvedAttr.run { if (resourceId != 0) resourceId else data }
return ContextCompat.getColor(this, colorRes)
}
使用法:
textView.setTextColor(mActivity.getColorResCompat(Android.R.attr.textColorPrimary))
これは@ benjiko99の返信のKotlinバージョンです。誰かがそれを必要とした場合に備えて、私はそれを追加しました。私にとってはうまくいきました。ありがとう@ Benjiko99
fun resolveThemeAttr(context: Context, @AttrRes attrRes: Int): TypedValue {
val theme = context.theme
val typedValue = TypedValue()
theme.resolveAttribute(attrRes, typedValue, true)
return typedValue
}
@ColorInt
fun resolveColorAttr(context: Context, @AttrRes colorAttr: Int): Int {
val resolvedAttr = resolveThemeAttr(context, colorAttr)
// resourceId is used if it's a ColorStateList, and data if it's a color reference or a hex color
val colorRes = if (resolvedAttr.resourceId != 0)
resolvedAttr.resourceId
else
resolvedAttr.data
return ContextCompat.getColor(context, colorRes)
}
使用する:
@ColorInt val color = resolveColorAttr(view.context,
Android.R.attr.textColorPrimary)
これが私の解決策です:
@ColorInt
fun Context.getColorCompat(@ColorRes colorRes: Int) = ContextCompat.getColor(this, colorRes)
@ColorInt
fun Fragment.getColorCompat(@ColorRes colorRes: Int) = activity!!.getColorCompat(colorRes)
@ColorInt
fun Activity.getColorCompatFromAttr(@AttrRes colorAttrRes: Int) = getColorCompat(getResIdFromAttribute(this, colorAttrRes))
@ColorInt
fun Fragment.getColorCompatFromAttr(@AttrRes colorAttrRes: Int) = activity!!.getColorCompatFromAttr(colorAttrRes)
getResIdFromAttribute
@JvmStatic
fun getResIdFromAttribute(activity: Activity, @AttrRes attr: Int): Int {
if (attr == 0)
return 0
val typedValue = TypedValue()
activity.theme.resolveAttribute(attr, typedValue, true)
val resourceId = typedValue.resourceId
return if (resourceId != 0)
resourceId
else typedValue.data
}