Wie bekomme ich Icons aus einem ActionBarSherlock Überlaufmenü auf Android 2.3?

Ich habe eine App mit ActionBarSherlock mit dem Thema Theme.Sherlock.Light.DarkActionBar . Aktionsleiste ist dunkel und meine Menüsymbole sind hell. Wenn ich meine App auf kleinen Layouts ausführe, werden im Überlaufmenü 2 oder 3 Menüpunkte mit Icons angezeigt.

Auf Android 3+ werden die Overflow-Menüpunkte ihre Symbole nicht anzeigen, aber auf Android 2.3 und früher sehe ich Menüfliesen mit fast unsichtbaren Icons, weil die Fliesenfarbe weiß ist und die Icons nah sind, um weiß zu sein.

  • Verschwindende Aktionsbalken-Schaltflächen beim Ausrollen zwischen Fragmenten
  • Android: TabHost - Übergeben von Parametern an Fragmente
  • ActionBarSherlock setCustomView funktioniert nicht in Android 3.2
  • Gradle-Standort ist falscher Fehler beim Importieren von ActionBarsherlock in Android Studio
  • ProgressBar horizontal nach oben ausrichten (Lücke entfernen)
  • Benutzerdefinierte Schriftart für ActionBarSherlock-Registerkarten
  • Bildbeschreibung hier eingeben

    Wie Sie sehen können, sind die Lichtsymbole auf einem weißen Hintergrund unsichtbar, aber sie müssen eine helle Farbe haben, um in einer dunklen Aktionsleiste sichtbar zu sein:

    Bildbeschreibung hier eingeben

    Kann ich Icons entfernen, wenn Menüpunkte im Überlaufmenü angezeigt werden?

  • Benutzerdefinierte Listenelemente, die nicht auf state_checked im selector reagieren
  • Android ViewPager und ListViews
  • Android Back Arrow auf Toolbar (AppCompatActivity)
  • Der beste Weg, um Dropdown-Menü in Android 2.x wie in ICS zu erstellen
  • Offline-Android-Anwendung mit Online-Synchronisierung
  • Gibt es irgendwelche Verwendung von favicon.ico für mobile Webseiten?
  • 5 Solutions collect form web for “Wie bekomme ich Icons aus einem ActionBarSherlock Überlaufmenü auf Android 2.3?”

    Ich stand auch vor der gleichen Frage:

    Es gibt viele Möglichkeiten, die Sie erreichen können, anstatt das Bild zu entfernen:

    1) Sie können den entsprechenden Zeichnungsordner verwenden, um helles und dunkles Bild zu setzen.

    2) Sie können die Hintergrundfarbe auch durch den Code Ihres Menüs ändern, indem Sie Ihre Geräteversion überprüfen.

    Wenn Sie das Gerät nicht über das Überlaufmenü stützen, können Sie die Hintergrundfarbe Ihres Menüs ändern und auch die Menütextfarbe ändern.

    Ich war auch vor der gleichen Frage und beschlossen mit folgendem:

     static final Class<?>[] constructorSignature = new Class[] {Context.class, AttributeSet.class}; class MenuColorFix implements LayoutInflater.Factory { public View onCreateView(String name, Context context, AttributeSet attrs) { if (name.equalsIgnoreCase("com.android.internal.view.menu.ListMenuItemView")) { try { Class<? extends ViewGroup> clazz = context.getClassLoader().loadClass(name).asSubclass(ViewGroup.class); Constructor<? extends ViewGroup> constructor = clazz.getConstructor(constructorSignature); final ViewGroup view = constructor.newInstance(new Object[]{context,attrs}); new Handler().post(new Runnable() { public void run() { try { view.setBackgroundColor(Color.BLACK); List<View> children = getAllChildren(view); for(int i = 0; i< children.size(); i++) { View child = children.get(i); if ( child instanceof TextView ) { ((TextView)child).setTextColor(Color.WHITE); } } } catch (Exception e) { Log.i(TAG, "Caught Exception!",e); } } }); return view; } catch (Exception e) { Log.i(TAG, "Caught Exception!",e); } } return null; } } public List<View> getAllChildren(ViewGroup vg) { ArrayList<View> result = new ArrayList<View>(); for ( int i = 0; i < vg.getChildCount(); i++ ) { View child = vg.getChildAt(i); if ( child instanceof ViewGroup) { result.addAll(getAllChildren((ViewGroup)child)); } else { result.add(child); } } return result; } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { LayoutInflater lInflater = getLayoutInflater(); if ( lInflater.getFactory() == null ) { lInflater.setFactory(new MenuColorFix()); } super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.myMenu, menu); } 

    3) ändern Hintergrundfarbe aus styles.xml Datei

     <style name="Theme.MyTheme" parent="Theme.Sherlock.ForceOverflow"> <item name="actionBarStyle">@style/Widget.MyTheme.ActionBar</item> <item name="android:actionBarStyle">@style/Widget.MyTheme.ActionBar</item> </style> <style name="Widget.MyTheme.ActionBar" parent="Widget.Sherlock.ActionBar"> <item name="android:background">#ff000000</item> <item name="background">#ff000000</item> </style> 

    Für mich waren alle 3 gut gearbeitet

    Hoffe, das wird auch für dich funktionieren

    Sie können Konfigurationsqualifikatoren verwenden. z.B

    Einen zeichenbaren Ordner / res / drawable-v11 / setzen Sie alle "Licht" Icons in sie.

    Und für die dunkleren Icons den / res / drawable / folder verwenden.

    Achten Sie darauf, die gleichen Dateinamen in beiden Ordnern zu verwenden.

    Ich hoffe, ich habe dein Problem verstanden und das könnte dir helfen.

    Allerdings, wenn du die Drawables JUST für das Overflow-Menü ändern willst, denke ich nicht, dass es möglich ist. Auch weil die Menüsymbole nicht so gedacht sind. ActionBarSherlock ist wohl auch wegen solcher Themen, nicht einer offiziellen Bibliothek.

    OS 2.x war ein Chaos, da die Optionen Menü Hintergrund könnte schwarz oder weiß, je nach Gerät, ohne Möglichkeit zu wissen, welche sicher.

    Das einfache Update war, graue (# 888888) Icons für Android 2.x & under zu verwenden und deine modernen (ICS / JB) Icons in einen v11 Ordner für moderne Geräte zu setzen:

     drawable // old school icons drawable-v11 // modern icons 

    Das bedeutet natürlich, zeichen-mdpi-v11, drawable-hdpi-v11 und so weiter.

    Eine einfache Alternative zum Hinzufügen eines ganzen Satzes von doppelten dunklen Icons für 2.x Versionen können einfach entfernen Sie die Symbole aus allen Elementen, die in das Überlauf-Menü gehen können. Beispielsweise:

    res/menu

     <item android:id="@+id/menu_send_email" android:showAsAction="ifRoom" android:title="@string/menu_send_email"/> 

    res/menu-v11 (oder sogar res/menu-v9 , denn 2.3 hat normalerweise ein dunkles Menü)

     <item android:id="@+id/menu_send_email" android:icon="@drawable/ic_action_send_email" android:showAsAction="ifRoom" android:title="@string/menu_send_email"/> 

    Natürlich müssen Sie die Titel kurz genug machen, um in die ActionBar zumindest auf einigen größeren Bildschirmen passen, oder sich mit der Tatsache, dass sie immer in den Überlauf gehen.

    Eine weitere Möglichkeit besteht darin, die Symbole aus den Nicht-Aktionen in onPrepareOptionsMenu zu entfernen.

    Die Idee ist, actionbarsherlock's MenuItemImpl.isActionButton zu verwenden, um herauszufinden, ob jedes Element ein Aktionselement ist, und wenn nicht, um das Symbol zu entfernen. Dies ist ein bisschen schwierig, weil onPrepareOptionsMenu mindestens zweimal von ABS onPrepareOptionsMenu wird – das erste Mal, wenn es die MenuItemImpl.isActionButton , in welchem ​​Fall MenuItemImpl.isActionButton noch nicht gesetzt ist und immer false MenuItemImpl.isActionButton . Wenn das der Fall ist, wollen Sie die Icons allein lassen. Sobald die isActionButton , wird die isActionButton Methode für isActionButton true zurückgegeben, andernfalls false. Also möchtest du die Icons für diejenigen entfernen, die false zurückgeben. Dies ist, was ich kam mit:

     @Override public boolean onPrepareOptionsMenu(Menu menu) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { boolean buildingOptionsMenu = false; for (int i=0; i<menu.size(); ++i) { MenuItemImpl mi = (MenuItemImpl)menu.getItem(i); if (mi.isActionButton()) { buildingOptionsMenu = true; break; } } if (buildingOptionsMenu) { for (int i=0; i<menu.size(); ++i) { MenuItemImpl mi = (MenuItemImpl)menu.getItem(i); if (!mi.isActionButton()) { mi.setIcon(null); mi.setIcon(0); } } } } return super.onPrepareOptionsMenu(menu); } 

    Du brauchst diese beiden Importe:

     import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.internal.view.menu.MenuItemImpl; 

    Dies funktioniert in ABS 4.3.0, aber da es interne Bibliotheksklassen verwendet, kann es nicht mit anderen Versionen der Bibliothek funktionieren.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.