Сілтеме болған кезде (тақырып) түсті мәнді бағдарламалы түрде алыңыз

Мынаны қарастырайық:

styles.xml


attrs.xml


color.xml

#ff0071d3

Сондықтан тақырып түсі тақырыпқа сілтеме жасайды. Theme_color (сілтеме) бағдарламасын қалайша алуға болады? Әдетте, getResources (). GetColor() қолданатын болар едім, бірақ бұл жағдайда сілтеме берілмеген.

63

6 жауаптар

Бұл жұмыс істеу керек:

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() ішінде.

Мен оны сіздің құндылықтарыңызбен тексердім және ол тамаша жұмыс істеді.

148
қосылды
Қалай болғанда да, шешіміңізде 0 мәнінің түсі (TypedValue {t = 0x0/d = 0x0}) ... Мен declare-стильді қолданамын, түсіне сілтеме ғана
қосылды автор Seraphim's, көзі
@Heinrich Иә, рахмет.
қосылды автор Seraphim's, көзі
өтінімде manifest.xml бойынша. кодтан емес
қосылды автор Seraphim's, көзі
resolveAttribute() жалғанды ​​қайтарады
қосылды автор Seraphim's, көзі
рахмет Мен сіздің шешіміңізді шеше алмаймын, бірақ қате жіберемін: stackoverflow.com/questions/17278244/… Мүмкін, сізде бұл тәжірибе бар ...
қосылды автор Seraphim's, көзі
Тақырыпты әрекетке қолдануды қаламасаңыз, тақырып кодын пайдаланып ContextThemeWrapper жасай аласыз және содан кейін тақырыпты шығарып алыңыз.
қосылды автор Ted Hopp, көзі
Сізге тақырыпты қолданысқа енгізесіз бе?
қосылды автор Emanuel Moecklin, көзі
@Бұл жұмыс істейтініне сенімді болыңыз, тақырыпты қолданғаныңызға көз жеткізіңіз
қосылды автор Emanuel Moecklin, көзі
Иә, бұл істейді. Егер ол сіз үшін жұмыс істемесе, оны дұрыс істемейсіз. Жұмыс шешімін алғыңыз келсе, мәселені коды бар.
қосылды автор Emanuel Moecklin, көзі
Нақ іздеген нәрсе. Үлкен жұмыс істейді. Рахмет.
қосылды автор Martin Pfeffer, көзі
@TedHopp, тақырыптың идентификаторын қалай алуға болады?
қосылды автор Sakiboy, көзі
Тақырып идентификаторын қалай алуға болады: stackoverflow.com/q/10302853/2371425
қосылды автор Sakiboy, көзі
theme_color - ColorListState сілтемесі болса, theme_color «ажыратылған» күйінің түсі қалай шығарылады?
қосылды автор sudocoder, көзі
Жұмыс емес. Ол 0 мәнін қайтарады.
қосылды автор Kimi Chiu, көзі
Жоқ олай емес. Кем дегенде, менің ісім үшін емес. Мен тақырыпты бағдарламалы түрде қолданғаныма сенімдімін. Қалай болса да, мен құндылықтарды алудың басқа әдісін қолданамын.
қосылды автор Kimi Chiu, көзі
@ Серафим бұл жауапты қабылдауға тиіс
қосылды автор Heinrich, көзі
рахмет, бұл дұрыс!
қосылды автор Mao, көзі

Бұл мен үшін жұмыс істеді:

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

егер сіз өзіңіздің алшақтыңызды алуды қаласаңыз:

Integer.toHexString(color)
16
қосылды

Қабылданған жауапқа қосу үшін, егер сіз 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))

3
қосылды
ою, «интеграция» үшін рахмет. Мен kotlin пайдаланбаймын, бірақ қызықты.
қосылды автор Seraphim's, көзі

Қабылданған жауапқа қосу үшін, егер сіз 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))

3
қосылды
ою, «интеграция» үшін рахмет. Мен kotlin пайдаланбаймын, бірақ қызықты.
қосылды автор Seraphim's, көзі

Бірнеше түстерді алу қажет болса:

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
қосылды

Бірнеше түстерді алу қажет болса:

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
қосылды