web-dev-qa-db-ja.com

プログラムでテキストの色をプライマリに設定Android textview

プログラムで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);
24
jaibatrik

最後に、次のコードを使用して、テーマのプライマリテキストの色を取得しました-

// 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);
26
jaibatrik

属性が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);
8
Benjiko99

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

これは@ 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)
1
steven smith

これが私の解決策です:

@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
    }
0