21

मुझे v7 टूलबार के साथ कठिन समय है। ActionBar के लिए एक बार एक साधारण कार्य था, अब अत्यधिक जटिल लगता है। कोई फर्क नहीं पड़ता कि मैं किस शैली को सेट करता हूं, मैं या तो नेविगेशन आइकन (जो एक दराज खुलता है) या ओवरफ्लो मेनू आइकन (जो मेनू खोलता है) को बदल नहीं सकता है।टूलबार नेविगेशन और ओवरफ़्लो मेनू आइकन (एपकोपेट v7) को कैसे बदलें?

तो मैं मैं उन दो चिह्नों के लिए Drawable बदलने की जरूरत है एक Toolbar

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/ghex" 
    android:minHeight="?attr/actionBarSize" 
    app:theme="@style/ThemeOverlay.AppCompat.Light" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
    > 

मैं इसे इस

//before in the code I do 
mToolbar = (Toolbar) findViewById(R.id.toolbar); 

private void initToolbar() { 
    setSupportActionBar(mToolbar); 
    getSupportActionBar().setDisplayShowTitleEnabled(false); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 
} 

तरह लग रहा है अब कोड है,।

मैं कैसे compat v7 Toolbar के लिए ऐसा करते हैं? मुझे लगता है कि जब दराज खुला है तो एंड्रॉइड 5.0) दिखाई देने वाले तीर को बदलने की आवश्यकता होगी।

उत्तर

89

नेविगेशन आइकन को बदलने के लिए आप का उपयोग कर सकते हैं:

Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); 
setSupportActionBar(toolbar); 
toolbar.setNavigationIcon(R.drawable.my_icon); 

अतिप्रवाह आइकन को बदलने के लिए आप इस तरह एक शैली को परिभाषित कर सकते हैं:

<style name="AppTheme.Base" parent="Theme.AppCompat.Light"> 
    <item name="actionOverflowButtonStyle">@style/OverFlow</item> 
</style> 

<style name="OverFlow" parent="Widget.AppCompat.ActionButton.Overflow"> 
    <item name="android:src">@drawable/my_overflow_menu</item> 
</style> 

किसी भी मामले में, यह एक अच्छा नहीं हो सकता है ओवरफ्लो मेनू की तरह मानक आइकन बदलने का विचार।

आप आइकन का रंग बदलने के लिए करना चाहते हैं, तो आप उपयोग कर सकते हैं:

<android.support.v7.widget.Toolbar 
    app:theme="@style/ThemeToolbar" /> 


<style name="ThemeToolbar" parent="Theme.AppCompat.Light"> 

    <!-- navigation icon color --> 
    <item name="colorControlNormal">@color/my_color</item> 

    <!-- color of the menu overflow icon --> 
    <item name="android:textColorSecondary">@color/my_color</item> 
</style> 
+3

मैं केवल उन वस्तुओं का रंग बदलना चाहता हूं। क्या मैं इसे आकर्षित करने के बिना कर सकता हूं? – sandalone

+2

मैंने पहले से ही कोड से 'setNavigationIcon' को आजमाया है, लेकिन यह आइकन नहीं बदलता है। क्या मुझे स्टाइल के संदर्भ में टूलबार एक्सएमएल में कोई संदर्भ देना है? या मैंने बस मैनिफेस्ट फ़ाइल में पूर्ण ऐप की शैली सेट की है और जैसा आपने सुझाया है फिर से इसे फिर से स्टाइल करें? – sandalone

+1

@ सैंडलोन आप ड्रॉबल्स को बदले बिना रंग बदल सकते हैं। बस उत्तर –

1

उपरोक्त सभी समाधान एपीआई 21 या अधिक से अधिक में मेरे लिए काम किया, लेकिन एपीआई 19 (किटकैट) में ऐसा नहीं किया। एक छोटे से बदलाव करने से पहले के संस्करणों में मेरे लिए चाल थी। सूचना Widget.Holo बजाय Widget.AppCompat

<style name="OverFlowStyle" parent="@android:style/Widget.Holo.ActionButton.Overflow"> 
    <item name="android:src">@drawable/ic_overflow</item> 
</style> 
1

एक सरल, आसान और बेहतर दृष्टिकोण अगर हम केवल हैमबर्गर/वापस आइकन का रंग बदलने की जरूरत है, नहीं है।

यह बेहतर है क्योंकि यह वांछित आइकन के रंग को बदलता है, जबकि colorControlNormal और android:textColorSecondary टूलबार के अन्य बालदृश्य को भी प्रभावित कर सकता है।

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 
</style> 

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> 
    <item name="spinBars">true</item> 
    <item name="color">@android:color/white</item> 
</style> 
-1

आदेश आइकन दिखाने के लिए, का उपयोग getSupportActionBar().setIcon(R.xxx.xxx)

मेरे मामले में कोड है: -

getSupportActionBar().setIcon (R.mipmap.ic_launcher);

11
mToolbar.setNavigationIcon(R.mipmap.ic_launcher); 
    mToolbar.setOverflowIcon(ContextCompat.getDrawable(this, R.drawable.ic_menu)); 
+1

मुझे लगता है कि यह सबसे अच्छा जवाब है। क्योंकि विषयों और शैलियों को संशोधित करने से संबंधित कोई भी जवाब मेरे लिए काम नहीं करता है। – krisDrOid

4

सही मेनू के लिए आप यह कर सकते हैं:

public static Drawable setTintDrawable(Drawable drawable, @ColorInt int color) { 
      drawable.clearColorFilter(); 
      drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); 
      drawable.invalidateSelf(); 
      Drawable wrapDrawable = DrawableCompat.wrap(drawable).mutate(); 
      DrawableCompat.setTint(wrapDrawable, color); 
      return wrapDrawable; 
     } 

और अपनी गतिविधि में

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_profile, menu); 
     Drawable send = menu.findItem(R.id.send); 
     Drawable msg = menu.findItem(R.id.message); 
     DrawableUtils.setTintDrawable(send.getIcon(), Color.WHITE); 
     DrawableUtils.setTintDrawable(msg.getIcon(), Color.WHITE); 
     return true; 
    } 

यह परिणाम है:

enter image description here

+0

यदि आप वेक्टर का उपयोग कर रहे हैं तो आप 'एंड्रॉइड: tint = "अपने रंग" को कर सकते हैं जैसा कि उन्होंने किया था [https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the- वैक्टर-91cbafa87c88) – ArtiomLK

1

अपने डिफ़ॉल्ट विषय इस लाइन को जोड़ने;

<item name="colorControlNormal">@color/my_color</item> 
1

आप एक वेक्टर करने के लिए अपने माउस को बदलना चाहते हैं, एक नया बनाएँ। और उसके बाद में अपने Activity.java:

Toolbar toolbar = findViewById(R.id.your_toolbar); 
setSupportActionBar(toolbar); 
getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
toolbar.setNavigationIcon(R.drawable.your_icon); 
mToolbar.setOverflowIcon(ContextCompat.getDrawable(this, R.drawable.your_icon2)); 

वेक्टर आइकन रंग बदलने के लिए अपने वेक्टर एक्सएमएल फ़ाइल के पास जाओ .. इस मामले में यह your_icon.xml हो जाएगा, यह इस तरह दिखेगा:

<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:width="24dp" 
    android:height="24dp" 
    android:viewportWidth="24.0" 
    android:viewportHeight="24.0"> 
<path 
    android:fillColor="@color/Your_Color" 
    android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"/> 

ध्यान दें कि हम इन विशेषताओं का इस्तेमाल किया वेक्टर के रंग सेट करने के:

android:fillColor="@color/Your_Color" 

संपादित: आप अपने colors.XML से एक रंग का उपयोग नहीं कर सकते हैं या कहीं और, रंग वेक्टर के एक्सएमएल फ़ाइल में सीधे decalred किया जाना चाहिए .. तो यह इस तरह दिखेगा:

android:fillColor="#FFF" 
संबंधित मुद्दे