이걸 고려하세요:
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()
하지만이 경우에는 참조되기 때문에 사용 하지 않습니다!
답변
이 작업을 수행해야합니다.
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()
.
나는 당신의 가치로 그것을 테스트했으며 완벽하게 작동했습니다.
답변
kotlin을 사용하는 경우 허용되는 답변에 추가하십시오.
@ColorInt
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))
답변
이것은 나를 위해 일했습니다.
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)
답변
여러 색상을 얻으려면 다음을 사용할 수 있습니다.
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();
답변
build.gradle (앱)에 다음을 추가하십시오.
implementation 'androidx.core:core-ktx:1.1.0'
그리고 코드 어딘가에이 확장 함수를 추가합니다.
@ColorInt
@SuppressLint("Recycle")
fun Context.themeColor(
@AttrRes themeAttrId: Int
): Int {
return obtainStyledAttributes(
intArrayOf(themeAttrId)
).use {
it.getColor(0, Color.MAGENTA)
}
}
답변
다음은 여러 속성을 취하고 색상 정수 배열을 리턴하는 간결한 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;
}
답변
당신이 사용해야 드로어 블을 참조 찾고있는 사람들을 위해 false
에resolveRefs
theme.resolveAttribute(R.attr.some_drawable, typedValue, **false**);