2013-02-28 15 views
13

Ho un'applicazione con ActionBarSherlock utilizzando il tema Theme.Sherlock.Light.DarkActionBar. La barra delle azioni è scura e le icone del mio menu sono chiare. Quando eseguo la mia app su piccoli layout, 2 o 3 voci di menu con icone sono visualizzate nel menu di overflow.Come rimuovere icone dal menu di overflow di ActionBarSherlock su Android 2.3?

Su Android 3+ le voci del menu di overflow non visualizzano le icone, ma su Android 2.3 e precedenti vedo le tessere del menu con icone quasi invisibili, perché il colore del riquadro è bianco e le icone sono quasi bianche.

enter image description here

Come si può vedere, le icone di luce sono invisibili su uno sfondo bianco, ma devono avere colore chiaro per essere visibile su una barra di azione scuro:

enter image description here

Posso rimuovere le icone quando le voci di menu sono visualizzate nel menu di overflow?

+2

potresti essere in grado di scattare una foto di esso? –

+0

@KorniltsevAnatoly fatto – Andrew

+0

Ti suggerisco di postare questo nella pagina dei problemi ABS in quanto sembra essere un errore molto brutto. Voglio dire che nessuno vuole usare Light.DarkActionBar. Ecco un collegamento alla pagina dei problemi: https://github.com/JakeWharton/ActionBarSherlock/issues – DominicM

risposta

2

Sono stato anche affrontando lo stesso problema:

ci sono molti modi per raggiungere questo obiettivo, piuttosto che la rimozione di immagine:

1) è possibile utilizzare rispettiva cartella drawable di mettere un'immagine scura luce e.

2) È inoltre possibile modificare il colore di sfondo in base al codice del menu controllando la versione del dispositivo.

Se il dispositivo non supporta il menu di overflow, è possibile modificare il colore di sfondo del menu e modificare il colore del testo del menu.

Sono stato anche affrontando lo stesso problema e risolto utilizzando seguente:

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) cambiano colore di sfondo da file styles.xml

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

Per me, tutte le 3 ha funzionato bene

Speranza, questo funzionerà per voi pure

3

è possibile utilizzare i qualificatori di configurazione. ad es.

creare una cartella estraibile /res/drawable-v11/inserire tutte le icone "light" al suo interno.

e per le icone più scure utilizzare la cartella /res/drawable /.

assicurarsi di utilizzare lo stesso nome file in entrambe le cartelle.

Spero di aver capito il tuo problema e questo potrebbe aiutarti.

Tuttavia, se si desidera modificare i drawable JUST per il menu di overflow, non penso sia possibile. Anche perché le icone del menu non sono pensate per essere utilizzate in questo modo. ActionBarSherlock è probabilmente anche a causa di problemi come questo, non una libreria ufficiale.

+0

ActionBarSherlock aggiunge una barra delle azioni sui dispositivi pre-v11 e desidera comunque utilizzare le icone di luce su quei dispositivi in ​​modo che siano in contrasto con la barra delle azioni scure. – Travis

0

OS 2.x era un casino dato che lo sfondo del menu delle opzioni poteva essere nero o bianco, a seconda del dispositivo, senza alcun modo per sapere quale di sicuro.

La soluzione semplice è stato quello di usare (# 888888) Icone grigio per Android 2.x & sotto e mettere le moderne (ICS/JB) le icone in una cartella V11 per i dispositivi moderni:

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

Naturalmente questo significa drawable-mdpi-v11, drawable-hdpi-v11 e così via.

0

Una semplice alternativa all'aggiunta di un intero set di icone scure duplicate per le versioni 2.x può essere semplicemente rimuovere le icone da tutti gli elementi che possono andare al menu di overflow. Per esempio:

res/menu

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

res/menu-v11 (o anche res/menu-v9, perché 2.3 di solito ha un menù scuro)

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

Naturalmente, avete bisogno di fare i titoli abbastanza brevi per adattarsi ActionBar almeno su alcuni schermi più grandi, o accontentarsi del fatto che vanno sempre nell'overflow.

0

Un'altra opzione è rimuovere le icone dagli elementi non di azione in onPrepareOptionsMenu.

L'idea è di utilizzare actionbarsherlock MenuItemImpl.isActionButton per capire se ogni elemento è un elemento azione e se non rimuovere l'icona. Questo è reso un po 'complicato perché onPrepareOptionsMenu viene chiamato (almeno) due volte da ABS - la prima volta quando si costruisce la barra delle azioni, nel qual caso MenuItemImpl.isActionButton non è stato ancora impostato e restituirà sempre false. Se è così, vuoi lasciare le icone da solo. Una volta creata la barra delle azioni, il metodo isActionButton restituirà true per gli elementi della barra delle azioni, altrimenti falso. Quindi vuoi rimuovere le icone per quelle che restituiscono false. Questo è ciò che mi si avvicinò con:

@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); 
} 

Avrete bisogno di questi due importazioni:

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

Questo funziona in ABS 4.3.0, ma dal momento che utilizza classi della libreria interna potrebbe non funzionare con altre versioni della libreria.

Problemi correlati