एंड्रॉइड लॉलीपॉप में _really_ प्रोग्रामेटिक रूप से प्राथमिक और एक्सेंट रंग कैसे बदलें?


156

सबसे पहले, यह प्रश्न बहुत ही समान प्रश्न पूछता है। हालाँकि, मेरे प्रश्न में एक सूक्ष्म अंतर है।

मुझे पता है कि क्या यह संभव है कि क्या colorPrimaryकिसी थीम की विशेषता को मनमाना रंग में बदलना संभव है ?

उदाहरण के लिए, हमारे पास:

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

रनटाइम के दौरान, उपयोगकर्ता यह तय करता है कि वह #ccffffप्राथमिक रंग के रूप में उपयोग करना चाहता है । बेशक वहाँ कोई रास्ता नहीं मैं सभी संभव रंगों के लिए विषय बना सकते हैं।

मुझे कोई आपत्ति नहीं है अगर मुझे हैक करने का सामान करना है, जैसे कि एंड्रॉइड के निजी इंटर्नल्स पर भरोसा करना, जब तक कि यह सार्वजनिक एसडीके का उपयोग करके काम करता है।

मेरा लक्ष्य आखिरकार है ActionBar औरCheckBox इस प्राथमिक रंग का उपयोग करने के लिए सभी विगेट्स जैसे हैं ।


1
आपको पता नहीं है कि "एंड्रॉइड के निजी इंटर्नल" गैर-मौजूद एंड्रॉइड रिलीज़ के लिए क्या हैं। यह मत समझो कि एल के "निजी इंटर्नल्स" वही हैं जो उत्पादन रिलीज के संदर्भ में एल में बदल जाते हैं।
कॉमन्सवेयर सेप

नहीं, आप मनमाने डेटा को थीम में नहीं रख सकते। उस ने कहा, colorPrimary का उपयोग केवल एक्शन बार बैकग्राउंड के लिए किया जाता है, बार कलर और नोटिफिकेशन कलर को रिक्रिएट करता है और आप इन सभी को गतिशील रूप से बदल सकते हैं।
एलन सेव

2
मुझे लगता है कि आपको "रनटाइम में शैली की विशेषता को कैसे बदलना है" पूछना चाहिए, और मैंने जो उत्तर देखा, वह आप नहीं हैं। हालाँकि मुझे एक विचार है जो आपकी मदद कर सकता है। कस्टम ContextWrapper का उपयोग करें और अपने संसाधन प्रदान करें। इसे देखें: github.com/negusoft/holoaccent/blob/master/HoloAccent/src/com/… कुल मिलाकर इस प्रोजेक्ट से आपको अंदाजा हो सकता है कि ऐसा कैसे किया जाए।
मिकोस

1
बस यहां दिमाग लगाना, लेकिन सभी XML .dex फ़ाइलों में परिवर्तित हो जाती हैं जो आपके एंड्रॉइड एप्लिकेशन में जावा ऑब्जेक्ट के रूप में लोड होती हैं। क्या इसका मतलब यह नहीं है कि हम कोड से पूरे विषयों को बनाने और सेट करने में सक्षम होने के साथ-साथ एक कारखाने से विषय को अभी तक लिखा जाए? लगता है काफी काम है।
G_V

1
@NiekHaarman क्या आपने कभी कोई तरीका निकाला?
gbhall

जवाबों:


187

थीम्स अपरिवर्तनीय हैं, आप नहीं कर सकते।


8
धन्यवाद, क्रिस! उत्तर नहीं, जिसकी मुझे तलाश थी, लेकिन मुझे लगता है कि मुझे इसके साथ रहना होगा :)
नर्मदान

5
हाय @ क्रिस बैन्स, लेकिन कॉन्टैक्ट ऐप ने कॉन्टैक्ट बार के कलर के हिसाब से स्टेटस बार कलर और टूलबार कलर को कैसे बदला? यदि यह संभव है, तो मुझे लगता है कि नीके हरमैन की जरूरत बहुत दूर नहीं है क्योंकि उन्हें केवल उस रंग कोड को संग्रहीत करने की आवश्यकता है जो उपयोगकर्ता चाहते हैं। क्या आप इस बारे में अधिक बता सकते हैं? मैं भी कुछ ऐसा ही बनाना चाहता हूं, लेकिन वास्तव में इससे भ्रमित हूं।
स्वान

39
स्थिति बार रंग को Window.setStatusBarColor () के माध्यम से गतिशील रूप से बदला जा सकता है।
क्रिस बैन्स

9
क्या प्रोग्राम को थीम बनाना संभव है?
एंड्रयू ओवरब्रेटर

3
और स्टेटस बार के रंग को गतिशील रूप से बदलते हुए आप Window.setNavigationBarColor () - API 21 :)
user802421

65

मैं संपर्क ऐप के बारे में टिप्पणियों को पढ़ता हूं और यह कैसे प्रत्येक संपर्क के लिए एक विषय का उपयोग करता है।

संभवतः, संपर्क ऐप में कुछ पूर्वनिर्धारित थीम हैं (प्रत्येक सामग्री के लिए प्राथमिक रंग यहां से: http://www.google.com/design/spec/style/color.html )।

आप 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
आपके उत्तर के लिए धन्यवाद। दुर्भाग्य से, मेरा अनुरोध एक मनमाना रंग का उपयोग करने का था । बेशक सभी रंगों के लिए थीम बनाना संभव नहीं है।
नहरमन

1
@DanielGomezRico - AFAIK आप पहले से निर्धारित विषय को ओवरराइड कर सकते हैं, भले ही शुरू में सेट करें - जब तक आप इसे पर्याप्त रूप से जल्दी करते हैं। जैसा कि उत्तर में कहा गया है, "आप ऑनक्रीट विधि के अंदर सेटकॉन्टेंट व्यू पद्धति से पहले एक थीम लागू कर सकते हैं।"
टूलमेकरसैट

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 ) रंगों में से एक। लेकिन यदि आप एक छोटे प्रोग्राम है कि तब 512 में से एक बाहर की तरह कुछ (8 आप के लिए शैली परिभाषाएँ और जावा कोड उत्पन्न बारे में अगर 3 ) में से संभव होना चाहिए।

यह दिलचस्प बनाता है कि आप अपने विषय के विभिन्न पहलुओं के लिए विभिन्न शैली की ओवरले का उपयोग कर सकते हैं। colorAccentउदाहरण के लिए बस कुछ ओवरले परिभाषाएँ जोड़ें । अब आप प्राथमिक रंग और उच्चारण रंग के लिए विभिन्न मूल्यों को लगभग मनमाने ढंग से जोड़ सकते हैं ।

आपको यह सुनिश्चित करना चाहिए कि आपके ओवरले विषय की परिभाषाएं मूल रूप से मूल शैली की परिभाषा से शैली परिभाषाओं का एक समूह नहीं है। उदाहरण के लिए एक शैली जिसे AppTheme.OverlayRedअंतर्निहित रूप से परिभाषित किया गया है, जिसमें परिभाषित की गई सभी शैलियों AppThemeऔर इन सभी परिभाषाओं को भी लागू किया जाएगा जब आप मास्टर थीम को पैच करेंगे। इसलिए या तो ओवरले थीम नामों में डॉट्स से बचें या कुछ का उपयोग करें Overlay.Redऔर Overlayएक खाली शैली के रूप में परिभाषित करें ।


11
अपनी गतिविधि में कॉल करने applyStyleसे पहले कॉल करने का प्रयास करें setContentViewऔर यह काम करना चाहिए।
devconsole

1
हाँ ठीक है, तो यह काम कर सकता है! मैं टुकड़ा niveau में coloraccent नहीं गतिविधि को बदलने के लिए एक रास्ता खोज रहा हूँ! यही कारण है कि यह मेरे लिए दुख की बात नहीं है: <मेरा उपयोग मामला यह है कि मुझे टैब से स्विच करते समय FAB या टैब संकेतक के लिए अलग-अलग रंग चाहिए, जो एक अलग टुकड़ा शुरू करेगा!
डेनिस एंडरसन

धन्यवाद इससे बहुत मदद मिली! हालाँकि, मैं इसे कई बार करने में सक्षम नहीं हूँ। (colorPrimary के लिए एक, colorAccent के लिए एक, आदि)। क्या तुम मेरी मदद कर सकते हो? धन्यवाद। stackoverflow.com/questions/41779821/…
थॉमस वोस

1
यह उसी तरह का उत्तर है जिसके लिए मैं एक बार फिर +1 के लिए दूसरे खाते का उपयोग करना चाहता हूं। धन्यवाद।
बेनोइट डफ़्ज़

बहुत बहुत धन्यवाद, यह वही था जो मैं ढूंढ रहा था .... मुझे आशा है कि मैं इस दृष्टिकोण का उपयोग करके वर्तमान विषय के एक्सेंट रंग को बदल सकता हूं।
नसीब

32

मैंने किसी भी रंग की थीम बनाने के लिए कुछ समाधान बनाया है, शायद यह किसी के लिए उपयोगी हो सकता है। एपीआई 9+

1. सबसे पहले " res / values-v9 / " बनाएं और इस फाइल को वहां डालें : आपकी शैलियों के साथ स्टाइल। Xml और नियमित "res / मान" फ़ोल्डर का उपयोग किया जाएगा।

2. इस कोड को अपने रेस / मान / स्टाइल में रखें। 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);
    }
}

रंग बदलने के लिए, बस अपने RGB से रैंडम को बदलें, आशा है कि यह मदद करता है।

यहां छवि विवरण दर्ज करें

एक पूर्ण उदाहरण है: ColorTest.zip


क्या आप प्रोजेक्ट साझा कर सकते हैं?
एरसेलान खान

नया प्रोजेक्ट बनाएं, फ़ाइल डाउनलोड करें - "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 है जो विभिन्न रंगों के साथ विषयों की एक पूरी सूची घोषित करता है और कोड अनिवार्य रूप से उन विषयों में से एक को लागू करता है और गतिविधि को फिर से बनाता है। यह वही है जो अन्य उत्तरों ने भी हासिल करने की कोशिश की है .. अर्थात यह उन प्रोग्रामों को पूर्वनिर्धारित करके वर्कअराउंड है जो प्रोग्रामेटिक या डायनामिक रूप से थीम नहीं बना रहे हैं।
फ्रीज़क

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 फ़ाइल) में, ताकि आपको बैकग्राउंड को जावा में सेट करने की आवश्यकता न हो।
जेवियरसेगोवियाकोर्डोबा

लेकिन मेरे पास दो अलग-अलग टूलबार हैं, एक लाइट थीम के लिए और दूसरा डार्क थीम के लिए। अगर मैं एंड्रॉइड जोड़ता हूं: पृष्ठभूमि = "? Attr / colorPrimary" मुझे किसी प्रकार के चयनकर्ता का उपयोग करना होगा।
lgallard

मेरे पास बहुत सारे विषय थे और मैं केवल उस कोड का उपयोग करता हूं। इस ऐप पर एक नज़र डालें: play.google.com/store/apps/…
JavierSegoviaCordoba

-1

आप रंगप्रेमियों के रंग को नहीं बदल सकते, लेकिन आप एक अलग रंग-रूप-रंग के साथ एक नई शैली जोड़कर अपने आवेदन के विषय को बदल सकते हैं

<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 को एक प्राथमिक रंग के रूप में उपयोग करना चाहता है। निश्चित रूप से ऐसा कोई तरीका नहीं है जिससे मैं सभी संभावित रंगों के लिए थीम बना सकूं।" यह उस जरूरत को हल नहीं करता है; हालांकि अगर किसी ने यह नहीं बताया कि यह कैसे करना है, तो यह जानना उपयोगी होगा।
टूलमेकरसेव

-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


इस सवाल का जवाब नहीं है। विशेष रूप से भाग "मेरा लक्ष्य अंततः एक्शनबेर है और इस प्राथमिक रंग का उपयोग करने के लिए चेकबॉक्स की तरह सभी विजेट हैं। "
नहरमन

फिर बस एक चेकबॉक्स शामिल करने के लिए आगे बढ़ें। उदाहरण के लिए, यदि (v इंस्टोच चेकबॉक्स) {themeChexnoxWithColor (toolbarIconsColor) जोड़ें; मैं यह नहीं देखता कि यह आपके सवाल का ईमानदारी से जवाब कैसे देता है
माइकल केर्न

@nhaarman आप गतिशील रूप से इस स्टैकओवरफ्लो की तरह एक्शनबार रंग सेट कर सकते हैं ।questions/questions/23708637/change-actionbar-background-color-dynamically मैं अभी आपके प्रश्न को ठीक से नहीं समझता हूँ
माइकल केर्न

मेरे पास एक ऐप है जहां उपयोगकर्ता एक्शनबार रंग और एक्शनबार आइटम रंग चुन सकता है। मैं नहीं देखता कि आपको और क्या चाहिए
माइकल केर्न

2
यह मेरे लिए बहुत मददगार था।
जुगनू

-6

यह आप क्या कर सकते हैं:

एक फाइल को ड्रा करने योग्य फ़ोल्डर में लिखें, इससे बैकग्राउंड को नाम दिया जा सकता है

<?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"

अपनी थीम सेट करने पर यह रंग उसी का प्रतिनिधित्व करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.