webentwicklung-frage-antwort-db.com.de

Symbolleisten-Symbol für Android

Ich habe festgestellt, dass bei Verwendung von AppCompat-Designs die Standard-Symbolleistensymbole durch das Attribut colorControlNormal in meinem Stil eingefärbt werden.

<style name="MyTheme" parent="Theme.AppCompat">
    <item name="colorControlNormal">@color/yellow</item>
</style>

enter image description here

Wie Sie oben sehen können, ist dies jedoch nicht bei allen Symbolen der Fall. Ich habe das "Plus" -Zeichen bereitgestellt, das ich von den offiziellen Symbolen erhalten habe, und es wird nicht getönt (ich habe die "weiße" Version des PNG verwendet). Von dem, was ich unter Frage verstanden habe, tönt das System nur Icons mit einem Alphakanal. Ist das wahr?

Wenn ja: Gibt es einen Ort, an dem ich Alpha-definierte, offizielle Materialikonen finden kann? Wenn nicht - und wenn Symbolleistensymbole nur Alpha sein müssen, um gefärbt zu werden - wie erwartet Google, dass wir die bereitgestellten Symbole in einer Symbolleiste verwenden?

Irgendwo im SDK habe ich einige Icons gefunden, die auf _alpha.png enden, und sie werden tatsächlich gut eingefärbt. Ich brauche jedoch den kompletten Satz von Material-Icons, und von den offiziellen Quellen konnte ich nur white, grey600 und black finden. 

Das Anwenden einer ColorFilter zur Laufzeit wäre etwas schmerzhaft, und meine eigentliche Symbolleiste - mit einigen Symbolen, einige nicht, - sieht ziemlich schlecht aus.

29
natario

Ich sehe, dass diese Frage einige Ansichten bekommt, also werde ich eine Antwort für diejenigen posten, die die Kommentare nicht lesen.

Meine Vermutungen in der Frage waren alle falsch und es handelt sich nicht um Alpha-Kanäle, zumindest nicht äußerlich. Tatsache ist einfach das, zitiert @alanv,

AppCompat färbt nur seine eigenen Symbole ein. Für den Moment müssen Sie manuell Färben Sie alle Symbole, die Sie separat von AppCompat bereitstellen, ein.

Dies kann sich in der Zukunft ändern, aber auch nicht. In dieser Antwort können Sie auch die Liste der Symbole sehen (diese gehören alle zum internen Ressourcenordner von appcompat, sodass Sie sie nicht ändern können), die automatisch mit welcher Farbe gefärbt werden.

Persönlich verwende ich eine colorControlNormal, die schwarz oder weiß (oder ähnliche Schattierungen) ist, und importiere die Symbole mit dieser bestimmten Farbe. Farbige Symbole auf einem farbigen Hintergrund sehen ein wenig schlecht aus. Eine andere Lösung, die ich ansprechend fand, ist diese Klasse auf Github. Sie rufen einfach MenuColorizer.colorMenu() auf, wenn Sie das Menü erstellen.

6
natario

Eine weitere Option ist die Verwendung der neuen Unterstützung für Vektorzeichnungen in der Unterstützungsbibliothek.

Siehe res/xml/ic_search.xml im Blogbeitrag AppCompat - Alter der Vektoren

Beachten Sie den Verweis auf ?attr/colorControlNormal

<vector xmlns:Android="..."
    Android:width="24dp"
    Android:height="24dp"
    Android:viewportWidth="24.0"
    Android:viewportHeight="24.0"
    Android:tint="?attr/colorControlNormal">
    <path
        Android:pathData="..."
        Android:fillColor="@Android:color/white"/>
</vector>
22
Joe Bowbeer

Hier ist die Lösung, die ich verwende. Rufen Sie tintAllIcons nach onPrepareOptionsMenu oder dem entsprechenden Standort auf. Der Grund für mutate () liegt vor, wenn Sie die Symbole an mehreren Stellen verwenden. Ohne den Mutaten nehmen sie alle dieselbe Tönung an.

public class MenuTintUtils {
    public static void tintAllIcons(Menu menu, final int color) {
        for (int i = 0; i < menu.size(); ++i) {
            final MenuItem item = menu.getItem(i);
            tintMenuItemIcon(color, item);
            tintShareIconIfPresent(color, item);
        }
    }

    private static void tintMenuItemIcon(int color, MenuItem item) {
        final Drawable drawable = item.getIcon();
        if (drawable != null) {
            final Drawable wrapped = DrawableCompat.wrap(drawable);
            drawable.mutate();
            DrawableCompat.setTint(wrapped, color);
            item.setIcon(drawable);
        }
    }

    private static void tintShareIconIfPresent(int color, MenuItem item) {
        if (item.getActionView() != null) {
            final View actionView = item.getActionView();
            final View expandActivitiesButton = actionView.findViewById(R.id.expand_activities_button);
            if (expandActivitiesButton != null) {
                final ImageView image = (ImageView) expandActivitiesButton.findViewById(R.id.image);
                if (image != null) {
                    final Drawable drawable = image.getDrawable();
                    final Drawable wrapped = DrawableCompat.wrap(drawable);
                    drawable.mutate();
                    DrawableCompat.setTint(wrapped, color);
                    image.setImageDrawable(drawable);
                }
            }
        }
    }
}

Das kümmert sich nicht um den Überlauf, aber dafür können Sie Folgendes tun:

Layout:

<Android.support.v7.widget.Toolbar
    ...
    Android:theme="@style/myToolbarTheme" />

Styles:

<style name="myToolbarTheme">
        <item name="colorControlNormal">#FF0000</item>
</style>

Dies funktioniert ab appcompat v23.1.0.

20
Learn OpenGL ES

Ich konnte dies eigentlich auf API 10 (Gingerbread) machen und es hat sehr gut funktioniert.

Edit: Es hat auch auf API 22 funktioniert ...

Hier ist das Endergebnis.

 enter image description here

Hinweis: Das Symbol ist eine auslegbare Ressource in den zu zeichnenden Ordnern.

Nun ist es wie es gemacht wird:

@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);

    MenuItem item = menu.findItem(R.id.action_refresh);
    Drawable icon = getResources().getDrawable(R.drawable.ic_refresh_white_24dp);
    icon.setColorFilter(getResources().getColor(R.color.colorAccent), PorterDuff.Mode.SRC_IN);

    item.setIcon(icon);
}

An dieser Stelle können Sie es in jede gewünschte Farbe ändern!

15
Yusuph wickama

Sie können einfach eine benutzerdefinierte Symbolleiste erstellen, die beim Aufblasen des Menüs Ihre Tönungsfarbe verwendet.

public class MyToolbar extends Toolbar {
    ... some constructors, extracting mAccentColor from AttrSet, etc

    @Override
    public void inflateMenu(@MenuRes int resId) {
        super.inflateMenu(resId);
        Menu menu = getMenu();
        for (int i = 0; i < menu.size(); i++) {
            MenuItem item = menu.getItem(i);
            Drawable icon = item.getIcon();
            if (icon != null) {
                item.setIcon(applyTint(icon));
            }
        }
    }
    void applyTint(Drawable icon){
        icon.setColorFilter(
           new PorterDuffColorFilter(mAccentColor, PorterDuff.Mode.SRC_IN)
        );
    }

}

Stellen Sie einfach sicher, dass Sie Ihren Aktivitäts-/Fragment-Code aufrufen:

toolbar.inflateMenu(R.menu.some_menu);
toolbar.setOnMenuItemClickListener(someListener);

Kein Nachdenken, kein Lookup und nicht so viel Code, oder?

Verwenden Sie nicht onCreateOptionsMenu/onOptionsItemSelected, wenn Sie diesen Ansatz verwenden

4
Drew

Für SDK 23 oder höher:

<style name="AppThemeToolbar" parent="MyAppTheme">
        ....
        <item name="Android:drawableTint">@color/secondaryLightColor</item>
    </style>

    <com.google.Android.material.appbar.AppBarLayout
      Android:layout_width="match_parent"
      Android:layout_height="wrap_content">
      <androidx.appcompat.widget.Toolbar
          Android:theme="@style/AppThemeToolbar"
          Android:layout_width="match_parent"
          Android:layout_height="attr/actionBarSize">
      </androidx.appcompat.widget.Toolbar>
    </com.google.Android.material.appbar.AppBarLayout>

3
mlunap

Das ist die endgültige und wahre Antwort Erstellen Sie zunächst einen Stil für die Symbolleiste wie folgt:

  <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" >
     <item name="iconTint">@color/primaryTextColor</item>
    <!--choice your favorite color-->
  </style>

Fügen Sie dann in Ihrer Hauptanwendung oder in Ihrem Aktivitätsthema diese Zeile hinzu

  <item name="actionBarPopupTheme">@style/AppTheme.PopupOverlay</item>

Fügen Sie schließlich in Ihrer Layoutdatei diese Zeile in Ihre Symbolleiste ein

 Android:theme="?attr/actionBarPopupTheme"

Und dann sehen Sie Ihre Symbolleistensymbole in Ihrer Lieblingsfarbe

3
Ali mohammadi
@NonNull
public static Drawable setTintDrawable(@NonNull 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;
 }

und rufen Sie auf diese Weise an:

MenuItem location = menu.findItem(R.id.action_location);
DrawableUtils.setTintDrawable(location.getIcon(), Color.WHITE);

 enter image description here

0
chry

Mit androidX kannst du deine Toolbar so definieren

<androidx.appcompat.widget.Toolbar
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"
    Android:theme="@style/Toolbar" />

Erweitern Sie dann ein AppCompat-Design und legen Sie die colorControlNormal-Eigenschaft wie gewünscht fest:

<style name="Toolbar" parent="Theme.AppCompat.Light">
    <item name="colorControlNormal">@color/colorBaseWhite</item>
    <item name="Android:background">@color/colorPrimary</item>
</style>
0
Nicola Gallazzi