web-dev-qa-db-ja.com

参照(テーマ)の場合、プログラムで色の値を取得する

このことを考慮:

styles.xml

_<style name="BlueTheme" parent="@Android:style/Theme.Black.NoTitleBar">
    <item name="theme_color">@color/theme_color_blue</item>
</style>
_

attrs.xml

_<attr name="theme_color" format="reference" />
_

color.xml

_<color name="theme_color_blue">#ff0071d3</color>
_

そのため、テーマの色はテーマによって参照されます。プログラムでtheme_color(参照)を取得するにはどうすればよいですか?通常はgetResources().getColor()を使用しますが、この場合は参照されているため使用しません!

84
Seraphim's

これは仕事をする必要があります:

_TypedValue typedValue = new TypedValue();
Theme theme = context.getTheme();
theme.resolveAttribute(R.attr.theme_color, typedValue, true);
@ColorInt int color = typedValue.data;
_

また、このコードを呼び出す前に、アクティビティにテーマを適用してください。次のいずれかを使用します。

_Android:theme="@style/Theme.BlueTheme"
_

マニフェストまたは呼び出しで(setContentView(int)を呼び出す前に):

_setTheme(R.style.Theme_BlueTheme)
_

onCreate()で。

私はあなたの価値でそれをテストしました、そしてそれは完全に働きました。

192

これは私のために働いた:

int[] attrs = {R.attr.my_attribute};
TypedArray ta = context.obtainStyledAttributes(attrs);
int color = ta.getResourceId(0, Android.R.color.black);
ta.recycle();

16進文字列を取得する場合:

Integer.toHexString(color)
18
Angel Solis

Kotlinを使用している場合、受け入れられた答えに追加します。

_fun Context.getColorFromAttr(
    @AttrRes attrColor: Int,
    typedValue: TypedValue = TypedValue(),
    resolveRefs: Boolean = true
): Int {
    theme.resolveAttribute(attrColor, typedValue, resolveRefs)
    return typedValue.data
}
_

そして、あなたの活動でできること

textView.setTextColor(getColorFromAttr(R.attr.color))

17
Bri6ko

複数の色を取得する場合は、次を使用できます。

int[] attrs = {R.attr.customAttr, Android.R.attr.textColorSecondary, 
        Android.R.attr.textColorPrimaryInverse};
Resources.Theme theme = context.getTheme();
TypedArray ta = theme.obtainStyledAttributes(attrs);

int[] colors = new int[attrs.length];
for (int i = 0; i < attrs.length; i++) {
    colors[i] = ta.getColor(i, 0);
}

ta.recycle();
2
Nicolas

簡潔なJavaユーティリティメソッドは、複数の属性を取り、色整数の配列を返します。:)

/**
 * @param context    Pass the activity context, not the application context
 * @param attrFields The attribute references to be resolved
 * @return int array of color values
 */
@ColorInt
static int[] getColorsFromAttrs(Context context, @AttrRes int... attrFields) {
    int length = attrFields.length;
    Resources.Theme theme = context.getTheme();
    TypedValue typedValue = new TypedValue();

    @ColorInt int[] colorValues = new int[length];

    for (int i = 0; i < length; ++i) {
        @AttrRes int attr = attrFields[i];
        theme.resolveAttribute(attr, typedValue, true);
        colorValues[i] = typedValue.data;
    }

    return colorValues;
}
0
varun