วิธี _really_ เปลี่ยนสีหลักและสีใน Android Lollipop โดยทางโปรแกรมอย่างไร


156

ก่อนอื่นคำถามนี้ถามคำถามที่คล้ายกันมาก อย่างไรก็ตามคำถามของฉันมีความแตกต่างเล็กน้อย

สิ่งที่ฉันอยากรู้คือมันเป็นไปได้หรือไม่ที่จะเปลี่ยนcolorPrimaryคุณลักษณะของธีมเป็นสีโดยพลการหรือไม่?

ตัวอย่างเช่นเรามี:

<style name="AppTheme" parent="android:Theme.Material.Light">
    <item name="android:colorPrimary">#ff0000</item>
    <item name="android:colorAccent">#ff0000</item>
</style>

เมื่อรันไทม์ผู้ใช้ตัดสินใจว่าเขาต้องการใช้#ccffffเป็นสีหลัก แน่นอนไม่มีวิธีที่ฉันสามารถสร้างชุดรูปแบบสำหรับสีที่เป็นไปได้ทั้งหมด

ฉันไม่รังเกียจถ้าฉันต้องทำเรื่องแฮ็กเช่นอาศัยการทำงานส่วนตัวของ Android ตราบใดที่มันใช้งาน SDK สาธารณะ

เป้าหมายของฉันคือในที่สุดก็มีActionBar และวิดเจ็ตทั้งหมดเช่น a CheckBoxเพื่อใช้สีหลักนี้


1
คุณไม่มีความคิดว่า "internals ส่วนตัวของ Android" มีไว้สำหรับการเปิดตัว Android ที่ไม่มีอยู่จริง อย่าสันนิษฐานว่า "internals ส่วนตัว" ของ L นั้นเหมือนกับสิ่งที่ L กลายเป็นในแง่ของการเปิดตัวการผลิต
CommonsWare

ไม่คุณไม่สามารถวางข้อมูลเองลงในธีมได้ ที่กล่าวว่า colorPrimary ใช้สำหรับพื้นหลังแถบแอ็คชันสีแถบล่าสุดและสีการแจ้งเตือนเท่านั้นและคุณสามารถเปลี่ยนทั้งหมดเหล่านี้แบบไดนามิก
alanv

2
ฉันคิดว่าคุณควรถาม "วิธีการเปลี่ยนคุณสมบัติของสไตล์ใน runtime" และจากสิ่งที่ฉันเห็นคำตอบคือคุณไม่สามารถ อย่างไรก็ตามฉันมีความคิดที่อาจช่วยคุณได้ ใช้ ContextWrapper ที่กำหนดเองและจัดหาทรัพยากรของตัวเอง ดูที่นี่: github.com/negusoft/holoaccent/blob/master/HoloAccent/src/com/…โดยรวมแล้วโครงการนี้อาจทำให้คุณมีความคิดในการทำเช่นนั้น
Mikooos

1
เพียงแค่ระดมสมองที่นี่ แต่ XML ทั้งหมดจะถูกแปลงเป็นไฟล์. dex ที่โหลดลงในแอปพลิเคชัน Android ของคุณในฐานะที่เป็นวัตถุของจาวา ไม่ได้หมายความว่าเราควรจะสามารถสร้างและตั้งค่าชุดรูปแบบทั้งหมดจากรหัสรวมทั้งสร้างชุดรูปแบบจากโรงงานที่ยังไม่ได้เขียน? เสียงเหมือนทำงานมาก
G_V

1
@NiekHaarman คุณเคยคิดวิธีออกไหม?
gbhall

คำตอบ:


187

ชุดรูปแบบไม่เปลี่ยนรูปแบบคุณไม่สามารถ


8
ขอบคุณคริส! ไม่ได้คำตอบที่ผมมองหา แต่ผมคิดว่าผมจะต้องอยู่กับมัน :)
nhaarman

5
สวัสดี @Chris Banes แต่แอปติดต่อเปลี่ยนสีแถบสถานะและแถบเครื่องมือตามสีธีมของผู้ติดต่ออย่างไร ถ้าเป็นไปได้ฉันคิดว่าสิ่งที่ Niek Haarman ต้องการนั้นไม่ไกลนักเนื่องจากเขาเพียงแค่ต้องเก็บรหัสสีที่ผู้ใช้ต้องการเท่านั้น คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ไหม? ฉันต้องการสร้างบางสิ่งเช่นนี้ แต่ฉันสับสนกับมันมาก
วอน

39
สีของแถบสถานะสามารถเปลี่ยนได้แบบไดนามิกผ่าน Window.setStatusBarColor ()
Chris Banes

9
เป็นไปได้ไหมที่จะสร้างธีมโดยใช้โปรแกรม?
Andrew Orobator

3
และในขณะที่การเปลี่ยนสีของแถบสถานะแบบไดนามิกคุณยังสามารถเปลี่ยนสีของแถบนำทางผ่าน Window.setNavigationBarColor () - API 21 :)
802421

65

ฉันอ่านความคิดเห็นเกี่ยวกับแอพผู้ติดต่อและวิธีใช้ธีมสำหรับผู้ติดต่อแต่ละคน

น่าจะเป็นแอปผู้ติดต่อมีธีมที่กำหนดไว้ล่วงหน้า (สำหรับสีหลักของวัสดุแต่ละสีจากที่นี่: http://www.google.com/design/spec/style/color.html )

คุณสามารถใช้ชุดรูปแบบก่อนที่เมธอด setContentView ภายในเมธอด onCreate

จากนั้นแอพผู้ติดต่อสามารถใช้ธีมสุ่มกับผู้ใช้แต่ละคน

วิธีนี้คือ:

setTheme(R.style.MyRandomTheme);

แต่วิธีนี้มีปัญหาตัวอย่างเช่นมันสามารถเปลี่ยนสีของแถบเครื่องมือสีของเอฟเฟกต์การเลื่อนสีระลอก ฯลฯ แต่ไม่สามารถเปลี่ยนสีของแถบสถานะและสีของแถบนำทางได้ (หากคุณต้องการเปลี่ยนด้วย)

จากนั้นสำหรับการแก้ปัญหานี้คุณสามารถใช้วิธีก่อนและ:

if (Build.VERSION.SDK_INT >= 21) {
        getWindow().setNavigationBarColor(getResources().getColor(R.color.md_red_500));
        getWindow().setStatusBarColor(getResources().getColor(R.color.md_red_700));
    }

สองวิธีนี้เปลี่ยนสีของแถบการนำทางและแถบสถานะ จำไว้ว่าถ้าคุณตั้งค่าแถบการนำทางโปร่งแสงคุณจะไม่สามารถเปลี่ยนสีได้

นี่ควรเป็นรหัสสุดท้าย:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTheme(R.style.MyRandomTheme);
    if (Build.VERSION.SDK_INT >= 21) {
        getWindow().setNavigationBarColor(getResources().getColor(R.color.myrandomcolor1));
        getWindow().setStatusBarColor(getResources().getColor(R.color.myrandomcolor2));
    }
    setContentView(R.layout.activity_main);

}

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

ตัวอย่างของธีม:

<style name="MyRandomTheme" parent="Theme.AppCompat.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/myrandomcolor1</item>
    <item name="colorPrimaryDark">@color/myrandomcolor2</item>
    <item name="android:navigationBarColor">@color/myrandomcolor1</item>
</style>

ขอโทษสำหรับภาษาอังกฤษของฉัน


1
ขอบคุณสำหรับคำตอบ. น่าเสียดายที่คำขอของฉันคือการใช้สีโดยพลการ แน่นอนว่ามันเป็นไปไม่ได้ที่จะสร้างธีมสำหรับทุกสี
nhaarman

1
@DanielGomezRico - AFAIK คุณสามารถแทนที่ชุดรูปแบบที่ตั้งไว้ล่วงหน้าโดยไม่คำนึงถึงตำแหน่งที่ตั้งไว้ในตอนแรก - ตราบใดที่คุณยังเร็วพอ ตามคำตอบบอกว่า"คุณสามารถใช้ชุดรูปแบบก่อนที่เมธอด setContentView ภายในเมธอด onCreate"
ToolmakerSteve

50

คุณสามารถใช้Theme.applyStyleเพื่อปรับเปลี่ยนชุดรูปแบบของคุณที่รันไทม์โดยใช้สไตล์อื่นกับมัน

สมมติว่าคุณมีคำจำกัดความลักษณะเหล่านี้:

<style name="DefaultTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/md_lime_500</item>
    <item name="colorPrimaryDark">@color/md_lime_700</item>
    <item name="colorAccent">@color/md_amber_A400</item>
</style>

<style name="OverlayPrimaryColorRed">
    <item name="colorPrimary">@color/md_red_500</item>
    <item name="colorPrimaryDark">@color/md_red_700</item>
</style>

<style name="OverlayPrimaryColorGreen">
    <item name="colorPrimary">@color/md_green_500</item>
    <item name="colorPrimaryDark">@color/md_green_700</item>
</style>

<style name="OverlayPrimaryColorBlue">
    <item name="colorPrimary">@color/md_blue_500</item>
    <item name="colorPrimaryDark">@color/md_blue_700</item>
</style>

ตอนนี้คุณสามารถแก้ไขชุดรูปแบบของคุณที่รันไทม์เช่น:

getTheme().applyStyle(R.style.OverlayPrimaryColorGreen, true);

วิธีการapplyStyleจะต้องมีการเรียกก่อนที่รูปแบบที่ได้รับการขยายตัว! ดังนั้นหากคุณโหลดมุมมองด้วยตนเองคุณควรใช้สไตล์กับธีมก่อนที่จะโทรเข้ามาsetContentViewในกิจกรรมของคุณ

แน่นอนว่าสิ่งนี้ไม่สามารถใช้เพื่อระบุสีโดยพลการเช่นสีหนึ่งใน 16 ล้าน (256 3 ) สี แต่ถ้าคุณเขียนโปรแกรมขนาดเล็กที่สร้างนิยามสไตล์และรหัส Java สำหรับคุณสิ่งที่คล้ายกับหนึ่งใน 512 (8 3 ) ควรเป็นไปได้

สิ่งที่ทำให้สิ่งนี้น่าสนใจคือคุณสามารถใช้การวางซ้อนสไตล์ที่แตกต่างกันสำหรับแง่มุมต่าง ๆ ของธีมของคุณ เพียงเพิ่มคำจำกัดความการซ้อนทับสองสามcolorAccentตัวอย่างเช่น ตอนนี้คุณสามารถรวมค่าที่แตกต่างกันสำหรับสีหลักและสีที่ถูกเน้นเกือบพล

คุณควรตรวจสอบให้แน่ใจว่าคำจำกัดความของชุดรูปแบบการซ้อนทับของคุณไม่ได้สืบทอดการกำหนดรูปแบบพวงจากคำนิยามลักษณะหลักโดยไม่ตั้งใจ ตัวอย่างเช่นสไตล์ที่เรียกว่าAppTheme.OverlayRedimplicitly สืบทอดสไตล์ทั้งหมดที่กำหนดไว้ในAppThemeและนิยามเหล่านี้ทั้งหมดจะถูกนำไปใช้เมื่อคุณแก้ไขชุดรูปแบบหลัก ดังนั้นหลีกเลี่ยงจุดในชื่อชุดรูปแบบการซ้อนทับหรือใช้สิ่งที่ชอบOverlay.RedและกำหนดOverlayเป็นสไตล์ที่ว่างเปล่า


11
ลองโทรapplyStyleก่อนโทรsetContentViewในกิจกรรมของคุณและควรใช้งานได้
devconsole

1
ใช่แล้วก็อาจใช้ได้! ฉันกำลังค้นหาวิธีที่จะเปลี่ยน coloraccent ในส่วน niveau ไม่ใช่กิจกรรม! นั่นเป็นเหตุผลว่าทำไมมันไม่ได้ผลสำหรับฉันเศร้า: <กรณีการใช้งานของฉันคือฉันต้องการสีที่แตกต่างสำหรับตัวบ่งชี้ FAB หรือแท็บเมื่อเปลี่ยนจากแท็บซึ่งจะเริ่มแตกเป็นส่วน ๆ !
Dennis Anderson

ขอบคุณสิ่งนี้ช่วยได้มาก! อย่างไรก็ตามฉันไม่สามารถทำได้หลายครั้ง (หนึ่งรายการสำหรับ colorPrimary หนึ่งรายการสำหรับ colorAccent ฯลฯ ) คุณช่วยฉันได้ไหม ขอบคุณ stackoverflow.com/questions/41779821/…
โธมัส Vos

1
นั่นเป็นคำตอบที่ฉันต้องการใช้บัญชีที่สองเพียง +1 อีกครั้ง ขอบคุณ
เบอนัวต์ดัฟเช

ขอบคุณมากนี่คือสิ่งที่ฉันกำลังมองหา .... ฉันหวังว่าฉันจะสามารถเปลี่ยนสีสำเนียงของชุดรูปแบบปัจจุบันโดยใช้วิธีการนี้
Nasib

32

ฉันได้สร้างวิธีแก้ปัญหาเพื่อสร้างชุดรูปแบบสีใด ๆ ซึ่งอาจเป็นประโยชน์สำหรับใครบางคน API 9+

1. ขั้นแรกให้สร้าง " res / values-v9 / " และวางไว้ที่ไฟล์นี้: styles.xml และโฟลเดอร์ "res / values" ปกติจะใช้กับสไตล์ของคุณ

2.ใส่รหัสนี้ใน res / values ​​/ styles.xml ของคุณ:

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">#000</item>
        <item name="colorPrimaryDark">#000</item>
        <item name="colorAccent">#000</item>
        <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
    </style>

    <style name="AppThemeDarkActionBar" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">#000</item>
        <item name="colorPrimaryDark">#000</item>
        <item name="colorAccent">#000</item>
        <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
    </style>

    <style name="WindowAnimationTransition">
        <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
        <item name="android:windowExitAnimation">@android:anim/fade_out</item>
    </style>
</resources>

3.ใน AndroidManifest:

<application android:theme="@style/AppThemeDarkActionBar">

4.สร้างคลาสใหม่ด้วยชื่อ "ThemeColors.java"

public class ThemeColors {

    private static final String NAME = "ThemeColors", KEY = "color";

    @ColorInt
    public int color;

    public ThemeColors(Context context) {
        SharedPreferences sharedPreferences = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);
        String stringColor = sharedPreferences.getString(KEY, "004bff");
        color = Color.parseColor("#" + stringColor);

        if (isLightActionBar()) context.setTheme(R.style.AppTheme);
        context.setTheme(context.getResources().getIdentifier("T_" + stringColor, "style", context.getPackageName()));
    }

    public static void setNewThemeColor(Activity activity, int red, int green, int blue) {
        int colorStep = 15;
        red = Math.round(red / colorStep) * colorStep;
        green = Math.round(green / colorStep) * colorStep;
        blue = Math.round(blue / colorStep) * colorStep;

        String stringColor = Integer.toHexString(Color.rgb(red, green, blue)).substring(2);
        SharedPreferences.Editor editor = activity.getSharedPreferences(NAME, Context.MODE_PRIVATE).edit();
        editor.putString(KEY, stringColor);
        editor.apply();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) activity.recreate();
        else {
            Intent i = activity.getPackageManager().getLaunchIntentForPackage(activity.getPackageName());
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            activity.startActivity(i);
        }
    }

    private boolean isLightActionBar() {// Checking if title text color will be black
        int rgb = (Color.red(color) + Color.green(color) + Color.blue(color)) / 3;
        return rgb > 210;
    }
}

5. กิจกรรมหลัก:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new ThemeColors(this);
        setContentView(R.layout.activity_main);
    }

    public void buttonClick(View view){
        int red= new Random().nextInt(255);
        int green= new Random().nextInt(255);
        int blue= new Random().nextInt(255);
        ThemeColors.setNewThemeColor(MainActivity.this, red, green, blue);
    }
}

หากต้องการเปลี่ยนสีเพียงแค่แทนที่ Random ด้วย RGB ของคุณหวังว่าจะช่วยได้

ป้อนคำอธิบายรูปภาพที่นี่

มีตัวอย่างที่สมบูรณ์คือ: ColorTest.zip


คุณสามารถแบ่งปันโครงการเป็นอย่างไร
Erselan Khan

สร้างโครงการใหม่ดาวน์โหลดไฟล์ - "styles.xml" และใช้รหัสที่ด้านบน โชคดี.
IQ.feature

1
ฉันไม่สามารถคาดหัว context.setTheme(context.getResources().getIdentifier("T_" + stringColor, "style", context.getPackageName()));คุณช่วยอธิบายให้ฉันหรือลิงค์เพื่อติดตามหัวข้อนี้ได้ไหม?
Langusten Gustel

1
@ IQ.feature ฉันคิดว่าการกดรหัสของคุณไปที่ Github repo นั้นเหมาะสมกว่าสำหรับการแชร์รหัส
Vadim Kotov

1
เพียงเพื่อให้ชัดเจนสำหรับคนอื่นเพราะฉันล้มเหลว ... มีไฟล์ res-v9 / styles.xml ซึ่งประกาศรายการทั้งหมดของชุดรูปแบบที่มีสีแตกต่างกันและรหัสเป็นหลักใช้หนึ่งในชุดรูปแบบเหล่านั้นและสร้างกิจกรรมใหม่ นี่คือคำตอบอื่น ๆ ที่พยายามบรรลุ .. เช่นเป็นวิธีแก้ปัญหาโดยกำหนดธีมที่ไม่ได้สร้างหรือสร้างธีมโดยทางโปรแกรมหรือแบบไดนามิก
frezq

3

ฉันใช้รหัสของ Dahnark แต่ฉันต้องเปลี่ยนพื้นหลังของแถบเครื่องมือ:

if (dark_ui) {
    this.setTheme(R.style.Theme_Dark);

    if (Build.VERSION.SDK_INT >= 21) {
        getWindow().setNavigationBarColor(getResources().getColor(R.color.Theme_Dark_primary));
        getWindow().setStatusBarColor(getResources().getColor(R.color.Theme_Dark_primary_dark));
    }
} else {
    this.setTheme(R.style.Theme_Light);
}

setContentView(R.layout.activity_main);

toolbar = (Toolbar) findViewById(R.id.app_bar);

if(dark_ui) {
    toolbar.setBackgroundColor(getResources().getColor(R.color.Theme_Dark_primary));
}

เพิ่มรหัสนี้: android: background = "? attr / colorPrimary" ไปยังแถบเครื่องมือของคุณ (ในไฟล์. xml) ดังนั้นคุณไม่จำเป็นต้องตั้งค่าพื้นหลังใน java
JavierSegoviaCordoba

แต่ฉันมีแถบเครื่องมือที่แตกต่างกันสองอันอันหนึ่งสำหรับชุดรูปแบบที่สว่างอีกอันสำหรับชุดที่มืด ถ้าฉันเพิ่ม android: background = "? attr / colorPrimary" ฉันต้องใช้ตัวเลือกบางอย่าง
lgallard

ฉันมีชุดรูปแบบมากมายและฉันใช้รหัสนั้นเท่านั้น ลองดูแอปนี้: play.google.com/store/apps/…
JavierSegoviaCordoba

-1

คุณไม่สามารถเปลี่ยนสีของ colorPrimary แต่คุณสามารถเปลี่ยนชุดรูปแบบของแอปพลิเคชันของคุณโดยการเพิ่มสไตล์ใหม่ด้วย colorPrimary ที่แตกต่างกัน

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>

<style name="AppTheme.NewTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorOne</item>
    <item name="colorPrimaryDark">@color/colorOneDark</item>
</style>

และภายในชุดรูปแบบกิจกรรม

 setTheme(R.style.AppTheme_NewTheme);
 setContentView(R.layout.activity_main);

ฉันเห็นว่ามีคำตอบก่อนหน้านี้ที่อธิบายลักษณะการสลับ คำตอบของคุณเหมาะสมกว่าสถานการณ์เหล่านั้นภายใต้สถานการณ์ใด และเพื่อความชัดเจนคำถามกล่าวว่า"ที่รันไทม์ผู้ใช้ตัดสินใจว่าเขาต้องการใช้ #ccffff เป็นสีหลักแน่นอนว่าไม่มีวิธีที่ฉันสามารถสร้างชุดรูปแบบสำหรับสีที่เป็นไปได้ทั้งหมด" สิ่งนี้ไม่ได้แก้ปัญหาความต้องการนั้น อย่างไรก็ตามถ้าไม่มีใครอธิบายวิธีการทำเช่นนี้มันจะมีประโยชน์ที่จะรู้
ToolmakerSteve

-2

จากกิจกรรมที่คุณสามารถทำได้:

getWindow().setStatusBarColor(i color);

2
ตลกที่คำตอบนี้มี -8 คะแนน แต่แก้ปัญหาของฉัน: D
Nabin Bhandari

-4

ใช้แถบเครื่องมือ

คุณสามารถตั้งค่าสีของรายการแถบเครื่องมือที่กำหนดเองแบบไดนามิกโดยการสร้างคลาสแถบเครื่องมือที่กำหนดเอง:

package view;

import android.app.Activity;
import android.content.Context;
import android.graphics.ColorFilter;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.support.v7.internal.view.menu.ActionMenuItemView;
import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomToolbar extends Toolbar{

    public CustomToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // TODO Auto-generated constructor stub
    }

    public CustomToolbar(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public CustomToolbar(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        ctxt = context;
    }

    int itemColor;
    Context ctxt;

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        Log.d("LL", "onLayout");
        super.onLayout(changed, l, t, r, b);
        colorizeToolbar(this, itemColor, (Activity) ctxt);
    } 

    public void setItemColor(int color){
        itemColor = color;
        colorizeToolbar(this, itemColor, (Activity) ctxt);
    }



    /**
     * Use this method to colorize toolbar icons to the desired target color
     * @param toolbarView toolbar view being colored
     * @param toolbarIconsColor the target color of toolbar icons
     * @param activity reference to activity needed to register observers
     */
    public static void colorizeToolbar(Toolbar toolbarView, int toolbarIconsColor, Activity activity) {
        final PorterDuffColorFilter colorFilter
                = new PorterDuffColorFilter(toolbarIconsColor, PorterDuff.Mode.SRC_IN);

        for(int i = 0; i < toolbarView.getChildCount(); i++) {
            final View v = toolbarView.getChildAt(i);

            doColorizing(v, colorFilter, toolbarIconsColor);
        }

      //Step 3: Changing the color of title and subtitle.
        toolbarView.setTitleTextColor(toolbarIconsColor);
        toolbarView.setSubtitleTextColor(toolbarIconsColor);
    }

    public static void doColorizing(View v, final ColorFilter colorFilter, int toolbarIconsColor){
        if(v instanceof ImageButton) {
            ((ImageButton)v).getDrawable().setAlpha(255);
            ((ImageButton)v).getDrawable().setColorFilter(colorFilter);
        }

        if(v instanceof ImageView) {
            ((ImageView)v).getDrawable().setAlpha(255);
            ((ImageView)v).getDrawable().setColorFilter(colorFilter);
        }

        if(v instanceof AutoCompleteTextView) {
            ((AutoCompleteTextView)v).setTextColor(toolbarIconsColor);
        }

        if(v instanceof TextView) {
            ((TextView)v).setTextColor(toolbarIconsColor);
        }

        if(v instanceof EditText) {
            ((EditText)v).setTextColor(toolbarIconsColor);
        }

        if (v instanceof ViewGroup){
            for (int lli =0; lli< ((ViewGroup)v).getChildCount(); lli ++){
                doColorizing(((ViewGroup)v).getChildAt(lli), colorFilter, toolbarIconsColor);
            }
        }

        if(v instanceof ActionMenuView) {
            for(int j = 0; j < ((ActionMenuView)v).getChildCount(); j++) {

                //Step 2: Changing the color of any ActionMenuViews - icons that
                //are not back button, nor text, nor overflow menu icon.
                final View innerView = ((ActionMenuView)v).getChildAt(j);

                if(innerView instanceof ActionMenuItemView) {
                    int drawablesCount = ((ActionMenuItemView)innerView).getCompoundDrawables().length;
                    for(int k = 0; k < drawablesCount; k++) {
                        if(((ActionMenuItemView)innerView).getCompoundDrawables()[k] != null) {
                            final int finalK = k;

                            //Important to set the color filter in seperate thread, 
                            //by adding it to the message queue
                            //Won't work otherwise. 
                            //Works fine for my case but needs more testing

                            ((ActionMenuItemView) innerView).getCompoundDrawables()[finalK].setColorFilter(colorFilter);

//                              innerView.post(new Runnable() {
//                                  @Override
//                                  public void run() {
//                                      ((ActionMenuItemView) innerView).getCompoundDrawables()[finalK].setColorFilter(colorFilter);
//                                  }
//                              });
                        }
                    }
                }
            }
        }
    }



}

จากนั้นอ้างถึงในไฟล์เลย์เอาต์ของคุณ ตอนนี้คุณสามารถตั้งค่าสีที่กำหนดเองโดยใช้

toolbar.setItemColor(Color.Red);

แหล่งที่มา:

ฉันพบข้อมูลที่จะทำสิ่งนี้ได้ที่นี่: จะเปลี่ยนสีไอคอนแถบเครื่องมือ Android ได้อย่างไร

และจากนั้นฉันก็แก้ไขปรับปรุงให้ดีขึ้นและโพสต์ไว้ที่นี่: GitHub: AndroidDynamicToolbarItemColor


นี่ไม่ได้ตอบคำถาม โดยเฉพาะอย่างยิ่งส่วน "เป้าหมายของฉันคือในที่สุดก็มี ActionBar และวิดเจ็ตทั้งหมดเช่นกล่องกาเครื่องหมายเพื่อใช้สีหลักนี้ "
nhaarman

จากนั้นเพิ่มเพื่อรวมช่องทำเครื่องหมาย ตัวอย่างเช่นเพิ่ม if (v instanceof CheckBox) {themeChexnoxWithColor (toolbarIconsColor); ฉันไม่เห็นว่าสิ่งนี้จะไม่ตอบคำถามของคุณอย่างสุจริต
Michael Kern

@nhaarman คุณสามารถกำหนดสีของ actionbar แบบไดนามิกเช่น stackoverflow.com/questions/23708637/change-actionbar-background-color-dynamically ฉันไม่เข้าใจคำถามของคุณอย่างแน่นอน
Michael Kern

ฉันมีแอพที่ผู้ใช้สามารถเลือกสีของแถบเครื่องมือและสีของรายการแถบเครื่องมือ ฉันไม่เห็นสิ่งที่คุณต้องการ
Michael Kern

2
นี่เป็นประโยชน์กับฉันมาก
Firefly

-6

นี่คือสิ่งที่คุณสามารถทำได้:

เขียนไฟล์ในโฟลเดอร์ drawable ให้ตั้งชื่อเป็น background.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="?attr/colorPrimary"/>
</shape>

จากนั้นตั้งค่าเค้าโครงของคุณ (หรือกรณีอื่น ๆ ) android:background="@drawable/background"

ในการตั้งค่าชุดรูปแบบของคุณสีนี้จะเป็นตัวแทนเดียวกัน

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