Vurgu rengi programlı olarak nasıl elde edilir?


89

Aşağıdaki gibi stillerde ayarlanan vurgu rengi programlı olarak nasıl getirilebilir?

    <item name="android:colorAccent">@color/material_green_500</item>

4
Olumsuz oy kullanan herkes düşüncelerini yoruma
Jakob

Yanıtlar:


132

Mevcut temadan şu şekilde getirebilirsiniz:

private int fetchAccentColor() {
    TypedValue typedValue = new TypedValue();

    TypedArray a = mContext.obtainStyledAttributes(typedValue.data, new int[] { R.attr.colorAccent });
    int color = a.getColor(0, 0);

    a.recycle();

    return color;
}

Destek sürümü ne olacak?
dariusL

4
Bu, destek sürümüdür.
rciovati

RGB dizesini colorPrimary içinde styles.xml veya colours.xml içinde ayarlayabilir miyiz?
Tanveer Bulsari

2
Bu benim için negatif bir sayı döndürüyor. Vurgu rengini elde etmenin geçerli yolu hala bu mu?
Naveed

1
TypedValue.data neye başvurur?
2017

45

Bu benim için de çalıştı:

public static int getThemeAccentColor (final Context context) {
    final TypedValue value = new TypedValue ();
    context.getTheme ().resolveAttribute (R.attr.colorAccent, value, true);
    return value.data;
}

Bu çözümde de aynı sorunu yaşıyorum, negatif değer ve düşüyor :(
batsheva

2
Negatif değer gayet iyi. Bu bir renk!
copolii

ama uygulamam çöktüğünde veya kaynak bulunamadığında ... bu normal bir renk koyduğumda olmuyor! bu yüzden değer iyi değil
batsheva

O halde kaynak bulunamazsa negatif değer nereden geliyor? Tüm söylediğim 0xff2506ac (örneğin) negatif sayı ve geçerli bir renk değeri.
copolii

2
Aldığınız negatif değer , kaynak kimliği değil gerçek renktir . Bunu bir kaynak kimliği olarak kullanmayın.
copolii

28
private static int getThemeAccentColor(Context context) {
    int colorAttr;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        colorAttr = android.R.attr.colorAccent;
    } else {
        //Get colorAccent defined for AppCompat
        colorAttr = context.getResources().getIdentifier("colorAccent", "attr", context.getPackageName());
    }
    TypedValue outValue = new TypedValue();
    context.getTheme().resolveAttribute(colorAttr, outValue, true);
    return outValue.data;
}

2
Bu, özel görünümler oluşturmak için ideal olan uygulama R sınıfını içe aktarmaya dayanmayan tek yanıttır.
Allan Veloso

13

Kotlin kullananlarınız için

fun Context.themeColor(@AttrRes attrRes: Int): Int {
    val typedValue = TypedValue()
    theme.resolveAttribute (attrRes, typedValue, true)
    return typedValue.data
}

11

Mevcut temadan renkleri almak için utils sınıfında statik bir yöntemim var. Çoğu zaman colorPrimary, colorPrimaryDark ve accentColor şeklindedir, ancak çok daha fazlasını elde edebilirsiniz.

@ColorInt
public static int getThemeColor
(
        @NonNull final Context context,
        @AttrRes final int attributeColor
)
{
    final TypedValue value = new TypedValue();
    context.getTheme ().resolveAttribute (attributeColor, value, true);
    return value.data;
}

8

İşte bu konudaki görüşüm:

public static String getThemeColorInHex(@NonNull Context context, @NonNull String colorName, @AttrRes int attribute) {
    TypedValue outValue = new TypedValue();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        context.getTheme().resolveAttribute(attribute, outValue, true);
    } else {
        // get color defined for AppCompat
        int appCompatAttribute = context.getResources().getIdentifier(colorName, "attr", context.getPackageName());
        context.getTheme().resolveAttribute(appCompatAttribute, outValue, true);
    }
    return String.format("#%06X", (0xFFFFFF & outValue.data));
}

Kullanım:

    String windowBackgroundHex = getThemeColorInHex(this, "windowBackground", android.R.attr.windowBackground);
    String primaryColorHex = getThemeColorInHex(this, "colorPrimary", R.attr.colorPrimary);

2
String.format()Bir altılı renk dizeye negatif tamsayı değeri dönüştürmek için nasıl açıklamak için yardımcı olur.
Mr-IDE

1
Bu, bu soru için kabul edilen cevaptan çok daha iyi / genel bir çözümdür!
Nilesh Pawar


2

Kotlin çözümü:

    context.obtainStyledAttributes(TypedValue().data, intArrayOf(R.attr.colorAccent)).let {
        Log.d("AppLog", "color:${it.getColor(0, 0).toHexString()}")
        it.recycle()
    }

0

Tek satır olmasını istiyorsanız, MaterialColors bu durumda kullanılabilir

            MaterialColors.getColor(context, R.attr.colorAccent,context.getResources().getColor(R.color.fall_back_color));

İlk argüman bağlamdır, ikinci argüman almanız gereken özelliktir ve üçüncü argüman, özniteliğin eksik olması veya öznitelik rengini alırken bir şeylerin ters gitmesi durumunda geri dönüş rengidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.