2014-10-31 14 views
8

Bei meinem Projekt habe ich bis vor einigen Tagen die Action-Leiste von sherlock benutzt, aber ich habe beschlossen, den gesamten Actionbar-Stil auf das neue Material-Design zu ändern. Auf meinem alten Thema für das Zurück und Überlauf-Symbol hatte ich einige benutzerdefinierte Symbole auf meinem Thema eingestellt. Aber auf der appcompat habe ich versucht, es zu meinem Thema zu definieren, wo ich es auf einer Symbolleiste verwende, aber es funktioniert nicht. Wer weiß, wie man das möglich macht?Android: AppCompat 21, wie ändert man das Zurück-Symbol und das Überlauf-Symbol in ein benutzerdefiniertes?

Mein Thema, wo ich auf der Symbolleiste (mit Asset-Studio generiert):

<style name="Theme.Themewiz" parent="@style/Theme.AppCompat.Light.DarkActionBar"> 
    <item name="android:actionBarStyle">@style/ActionBar.Solid.Themewiz</item> 

    <item name="android:actionBarItemBackground">@drawable/selectable_background_themewiz</item> 
    <item name="android:popupMenuStyle">@style/PopupMenu.Themewiz</item> 
    <item name="android:dropDownListViewStyle">@style/DropDownListView.Themewiz</item> 
    <item name="android:actionBarTabStyle">@style/ActionBarTabStyle.Themewiz</item> 
    <item name="android:actionDropDownStyle">@style/DropDownNav.Themewiz</item> 
    <item name="android:actionModeBackground">@drawable/cab_background_top_themewiz</item> 
    <item name="android:actionModeSplitBackground">@drawable/cab_background_bottom_themewiz</item> 
    <item name="android:actionModeCloseButtonStyle">@style/ActionButton.CloseMode.Themewiz</item> 

      <!-- Light.DarkActionBar specific --> 
    <item name="android:actionBarWidgetTheme">@style/Theme.Themewiz.Widget</item> 

    <item name="android:actionOverflowButtonStyle">@style/Theme.AppCompat.Overflow</item> 

</style> 

<style parent="@style/Widget.AppCompat.ActionButton.Overflow" name="Theme.AppCompat.Overflow"> 

    <item name="android:src">@drawable/ic_action_overflow</item> 

</style> 

Toolbar xml:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/my_awesome_toolbar" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    android:minHeight="?attr/actionBarSize" 
    android:background="?attr/colorPrimaryDark" 
    app:theme="@style/Theme.Themewiz" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 
+0

Code? XML? Ohne es ist es unmöglich zu helfen. –

+0

Ich bearbeite meinen Originalbeitrag mit dem xml vom Thema und dem xml von der Werkzeugleiste. – billiout

Antwort

12

AppCompat 21 Verwendung acheive diese recht einfach ist.

Um das Zurück-Symbol zu ändern, müssen Sie stattdessen die Support-Symbolleiste als Aktionsleiste verwenden. This post by Chris Banes sollten Sie beginnen.

Sobald Sie die Symbolleiste fertig sind hinzufügen, alles, was Sie tun müssen, ist:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_id); 
toolbar.setNavigationIcon(R.drawable.back_icon); 

Um das Überlaufsymbol auf der anderen Seite zu ändern, ist der einfachste Weg einen benutzerdefinierten Stil zum Hauptthema hinzufügen Erklärung. Etwas wie:

<resources> 
    <!-- Base application theme. --> 
    <style name="Your.Theme" parent="@style/Theme.AppCompat"> 
     <!-- Your theme items go here --> 

     <item name="actionOverflowButtonStyle">@style/OverFlow</item> 
    </style> 

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

</resources> 

Hoffe, dass hilft.

+2

Arbeitete für mich, außer mit '@ style/Widget.AppCompat.ActionButton.Overflow' anstelle von' @android: style/Widget.AppCompat.ActionButton.Overflow' – Birrel

+0

Es funktionierte für mich, aber es ist mit einer wirklich großen Version von meinem Symbol. Ich habe mehrere Symbole in mehreren aufklappbaren Ordnern, aber es scheint keine Größe zu wählen, die meinen anderen Symbolen entspricht. –

+0

Eigentlich hatte ich gerade eine Lösung für dieses Problem, das ich hatte. Ich musste ein 24dp-Icon verwenden. Sie können meine SO Frage und ihre Antwort hier sehen: http: // stackoverflow.com/questions/32450144/custom-overflow-icon-ist-zu-big-using-android-support-v7-und-appcompat –

4

Ich habe diese Art und Weise getan und es funktioniert für mich

<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/custom_button</item> 
</style> 
-3

For Change Navigation Arrow Check Code unten

final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha); 
upArrow.setColorFilter(Color.parseColor("#FFFFFF"), PorterDuff.Mode.SRC_ATOP); 
getSupportActionBar().setHomeAsUpIndicator(upArrow); 

Zuerst müssen wir den Inhalt Beschreibung Attribut auf das Überlaufmenü-Symbol hinzuzufügen, in Datei "styles.xml". Es kann eine beliebige Zeichenfolge sein, es wird nur benötigt, um die richtige Ansicht später im Code durch die Beschreibung zu finden.

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.MyTheme"> 
    <!-- Customize your theme here. --> 
    <item name="android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item> 
</style> 

<style name="Widget.ActionButton.Overflow" parent="@android:style/Widget.Holo.ActionButton.Overflow"> 
    <item name="android:contentDescription">@string/accessibility_overflow</item> 
</style> 

Zweitens haben wir die Methode verantwortlich für die Suche nach und das Einfärben der Überlauf-Symbol implementieren:

/* It's important to set overflowDescription atribute in styles, so we cangrab the reference 
* to the overflow icon. Check: res/values/styles.xml 
* @param activity 
* @param colorFilter 
*/ 
private static void setOverflowButtonColor(final Activity activity, final PorterDuffColorFilter colorFilter) { 
    final String overflowDescription = activity.getString(R.string.abc_action_menu_overflow_description); 
    final ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); 
    final ViewTreeObserver viewTreeObserver = decorView.getViewTreeObserver(); 
    viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      final ArrayList<View> outViews = new ArrayList<View>(); 
      decorView.findViewsWithText(outViews, overflowDescription, 
        View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION); 
      if (outViews.isEmpty()) { 
       return; 
      } 
      TintImageView overflow=(TintImageView) outViews.get(0); 
      overflow.setColorFilter(colorFilter); 
      removeOnGlobalLayoutListener(decorView,this); 
     } 
    }); 
} 

/***Use below code in your activity screen for apply color*/ 

final PorterDuffColorFilter colorFilter= new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.MULTIPLY); 
setOverflowButtonColor(this,colorFilter); 

Bitte untenstehenden Link prüfen Know mehr https://snow.dog/blog/how-to-dynamicaly-change-android-toolbar-icons-color/

+0

Bitte überprüfen Sie mein neues Update lassen Sie mich wissen, wenn eine Frage – Piyush

+0

Ist es möglich, die Überlauf-Taste zu bekommen zur Laufzeit, ohne den Stil zu setzen? –

4

die Ansichten Erste selbst ist ein bisschen schwierig, , aber die Einstellung ihrer Symbole und/oder Farben ist mit den Funktionen der Toolbar möglich. Beispiel:

toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha); 
final Drawable navigationIcon = toolbar.getNavigationIcon(); 
toolbar.setNavigationIcon(getTintedDrawable(this, navigationIcon, 0xffff0000)); 
final Drawable overflowIcon = toolbar.getOverflowIcon(); 
toolbar.setOverflowIcon(getTintedDrawable(this, overflowIcon, 0xffff0000)); 

public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Drawable inputDrawable, @ColorInt int color) { 
    Drawable wrapDrawable = DrawableCompat.wrap(inputDrawable); 
    DrawableCompat.setTint(wrapDrawable, color); 
    DrawableCompat.setTintMode(wrapDrawable, Mode.SRC_IN); 
    return wrapDrawable; 
} 
+0

danke Jungs deine Trickhilfe für mich .... –

+0

Gute Arbeit! Das hat für mich funktioniert – Arjun

Verwandte Themen