วิธีการรับสีที่เน้นโดยทางโปรแกรม?


90

เราจะดึงชุดสีที่เน้นในสไตล์เช่นด้านล่างโดยใช้โปรแกรมได้อย่างไร

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

4
ใครก็ตามที่ลงคะแนนควรอย่าลังเลที่จะโพสต์ความคิดเห็นของพวกเขาในความคิดเห็น ...
จา

คำตอบ:


132

คุณสามารถดึงมันจากธีมปัจจุบันด้วยวิธีนี้:

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;
}

แล้วรุ่นรองรับล่ะ?
DariusL

4
นี่คือเวอร์ชันที่รองรับ
rciovati

เราสามารถตั้งค่า RGB string เป็น colorPrimary ใน styles.xml หรือ colors.xml ได้ไหม ??
Tanveer Bulsari

2
นี่กำลังส่งคืนจำนวนลบให้ฉัน นี่ยังเป็นวิธีที่ถูกต้องในการรับสีที่เน้นหรือไม่?
Naveed

1
typedValue.data อ้างอิงถึงอะไร
GPack

45

สิ่งนี้ใช้ได้ผลสำหรับฉันเช่นกัน:

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

ฉันพบปัญหาเดียวกันในวิธีแก้ปัญหานี้เช่นกันค่าเป็นกลางและมันตก :(
batsheva

2
ค่าลบไม่เป็นไร มันเป็นสี!
copolii

แต่แอพพลิเคชั่นของฉันพังทลายลงโดยไม่พบทรัพยากรที่ผิดพลาด ... นี่จะไม่เกิดขึ้นเมื่อฉันใส่สีปกติ! ดังนั้นค่าจึงไม่ดี
batsheva

แล้วค่าลบมาจากไหนถ้าไม่พบทรัพยากร? ทั้งหมดที่ฉันพูดก็คือ 0xff2506ac (ตัวอย่าง) เป็นจำนวนลบและค่าสีที่ถูกต้อง
copolii

3
ค่าลบที่คุณได้รับคือสีจริง ไม่ใช่รหัสทรัพยากร อย่าใช้เป็นรหัสทรัพยากร
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
นี่เป็นคำตอบเดียวที่ไม่ต้องพึ่งพาการนำเข้าคลาส R ของแอปซึ่งเหมาะอย่างยิ่งสำหรับการสร้างมุมมองที่กำหนดเอง
Allan Veloso

13

สำหรับผู้ที่ใช้ Kotlin

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

11

ฉันมีวิธีการคงที่ในคลาส utils เพื่อรับสีจากธีมปัจจุบัน เวลาส่วนใหญ่เป็น colorPrimary, colorPrimaryDark และ accentColor แต่คุณจะได้รับมากกว่านั้น

@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

นี่คือสิ่งที่ฉันทำ:

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));
}

การใช้งาน:

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

2
String.format()ช่วยอธิบายวิธีการแปลงค่าจำนวนเต็มเชิงลบเพื่อสตริงสีฐานสิบหก
Mr-IDE

1
นี่เป็นวิธีแก้ปัญหาที่ดีกว่า / ทั่วไปมากกว่าคำตอบที่ยอมรับสำหรับคำถามนี้!
Nilesh Pawar

มีประโยชน์ด้วย: stackoverflow.com/questions/6539879/…
Mr-IDE


0

สามารถใช้ MaterialColors ในกรณีนี้หากคุณต้องการให้เป็นบรรทัดเดียว

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

อาร์กิวเมนต์แรกคือบริบทอาร์กิวเมนต์ที่สองคือแอตทริบิวต์ที่คุณต้องได้รับและอาร์กิวเมนต์ที่สามคือสีสำรองในกรณีที่แอตทริบิวต์หายไปหรือมีบางอย่างผิดพลาดขณะรับสีแอตทริบิวต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.