How can I set the text color of my TextView
to ?android:textColorPrimary
programmatically?
I've tried the code below but it sets the text color always to white for both textColorPrimary and textColorPrimaryInverse (Both of them are not white, I have checked through 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);
Finally I used the following code to get the primary text color of the theme -
// 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);
You need to check if the attribute got resolved to a resource or a color value .
The default value of textColorPrimary is not a Color but a ColorStateList , which is a resource .
Kotlin solution
@ColorInt
fun Context.resolveColorAttr(@AttrRes colorAttr: Int): Int {
val resolvedAttr = resolveThemeAttr(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(this, colorRes)
}
fun Context.resolveThemeAttr(@AttrRes attrRes: Int): TypedValue {
val typedValue = TypedValue()
theme.resolveAttribute(attrRes, typedValue, true)
return typedValue
}
Usage
@ColorInt val color = context.resolveColorAttr(android.R.attr.textColorPrimaryInverse)
Extension version in 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)
}
usage:
textView.setTextColor(mActivity.getColorResCompat(android.R.attr.textColorPrimary))
This is the kotlin version of another reply. I just added it in case someone needed it. Worked fine for me.
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)
}
Use:
@ColorInt val color = resolveColorAttr(view.context,
android.R.attr.textColorPrimary)
Here's my solution for it:
@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
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.