Pertimbangkan ini:
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>
Jadi warna tema dirujuk oleh temanya. Bagaimana saya bisa mendapatkan theme_color (referensi) secara terprogram? Biasanya saya akan menggunakan getResources().getColor()
tetapi tidak dalam kasus ini karena direferensikan!
android
android-resources
android-theme
Seraphim
sumber
sumber
ContextThemeWrapper
menggunakan id tema dan kemudian mengambil tema darinya.Untuk menambah jawaban yang diterima, jika Anda menggunakan kotlin.
dan kemudian dalam aktivitas Anda, Anda dapat melakukannya
textView.setTextColor(getColorFromAttr(R.attr.color))
sumber
@ColorInt fun Context.getThemeColor(@AttrRes attribute: Int) = TypedValue().let { theme.resolveAttribute(attribute, it, true); it.data }
(diformat dengan buruk di sini tapi tidak apa-apa)val errorColor = context.getThemeColor(R.attr.colorError)
ColorStateList
:@ColorInt fun Context.getThemeColor(@AttrRes attribute: Int) = obtainStyledAttributes(intArrayOf(attribute)).use { it.getColor(0, Color.MAGENTA) }
(dari Nick Butcher )ColorStateList
, bahkan jika itu mereferensikan atribut tema lain:fun Context.getThemeColor(@AttrRes attribute: Int): ColorStateList = TypedValue().let { theme.resolveAttribute(attribute, it, true); AppCompatResources.getColorStateList(this, it.resourceId) }
(warna tunggal juga akan dibungkusColorStateList
).Ini berhasil untuk saya:
jika Anda ingin mengeluarkan hexstring darinya:
sumber
Jika Anda ingin mendapatkan banyak warna, Anda dapat menggunakan:
sumber
Tambahkan ini ke build.gradle (app) Anda:
Dan tambahkan fungsi ekstensi ini di suatu tempat di kode Anda:
sumber
Berikut adalah metode utilitas Java ringkas yang mengambil banyak atribut dan mengembalikan larik bilangan bulat warna. :)
sumber
Bagi mereka yang mencari referensi untuk ditarik Anda harus menggunakan
false
diresolveRefs
theme.resolveAttribute(R.attr.some_drawable, typedValue, **false**);
sumber