2013-02-28 81 views
13

我有一個應用程序ActionBarSherlock使用主題Theme.Sherlock.Light.DarkActionBar。動作欄是黑暗的,我的菜單圖標很輕。當我在小布局上運行我的應用程序時,溢出菜單中會顯示2個或3個帶有圖標的菜單項。如何從Android 2.3的ActionBarSherlock的溢出菜單中刪除圖標?

在Android 3+上,溢出菜單項不會顯示它們的圖標,但在Android 2.3和更早版本中,我看到幾乎看不到圖標的菜單圖塊,因爲圖塊顏色是白色,圖標接近白色。

enter image description here

正如你可以看到,光圖標在白色背景上看不見的,但它們必須具有光色是一個黑暗的操作欄上看到:

enter image description here

我可以菜單項顯示在溢出菜單中時刪除圖標?

+2

可能你可以pst一個圖片嗎? – 2013-03-06 07:20:43

+0

@KorniltsevAnatoly完成 – Andrew 2013-03-07 07:48:33

+0

我建議你在ABS問題頁面上發佈它,因爲它似乎是一個非常糟糕的錯誤。我的意思是像這樣沒有人想使用Light.DarkActionBar。以下是問題頁面的鏈接: https://github.com/JakeWharton/ActionBarSherlock/issues – DominicM 2013-03-11 12:25:51

回答

2

我也面臨着同樣的問題:

有很多方法可以做到這一點,而不是刪除圖像:

1),可以使用相應的繪製文件夾,把光明與黑暗的圖像。

2)您也可以通過檢查您的設備版本來更改菜單代碼的背景顏色。

如果您的設備不支持溢出菜單,您可以更改菜單的背景顏色,也可以更改菜單文字顏色。

我也面臨着同樣的問題,使用下面的一個解決:

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

更改背景顏色對我來說,所有的3運行良好

希望,這也適用於你

3

您可以使用配置限定符。 例如

製作一個可繪製的文件夾 /res/drawable-v11 /將所有的「光」圖標放在其中。

對於較暗的圖標使用 /res/drawable /文件夾。

請務必在兩個文件夾中使用相同的文件名。

我希望我能理解你的問題,這可能對你有所幫助。

但是,如果你想改變溢出菜單的可繪製,我不認爲這是可能的。另外,因爲菜單圖標不打算像那樣使用。 ActionBarSherlock也可能是因爲這樣的問題,而不是官方庫。

+0

ActionBarSherlock在v11之前的設備上添加了一個操作欄,他仍然希望使用這些設備上的燈光圖標,以便與黑暗操作欄形成鮮明對比。 – Travis 2013-04-15 02:14:38

0

OS 2。由於選項菜單背景可能是黑色或白色,取決於設備,因此x是一團糟,無法知道哪些是肯定的。

的簡單的解決方法是使用灰色(#888888)的圖標爲Android 2.X &下,把你的現代(ICS/JB)圖標的文件夾V11現代設備:

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

當然這意味着drawable-mdpi-v11,drawable-hdpi-v11等等。

0

爲2.x版本添加一整套重複黑色圖標的簡單替代方法可以簡單地從所有可以進入溢出菜單的項目中刪除圖標。例如:

res/menu

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

res/menu-v11(甚至res/menu-v9,因爲2.3通常有一個黑暗的菜單)

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

當然,你需要足夠短,以適應標題至少在一些更大的屏幕上的ActionBar,或解決他們總是進入溢出的事實。

0

另一種方法是從onPrepareOptionsMenu中的非操作項目中刪除圖標。

這個想法是使用actionbarsherlock的MenuItemImpl.isActionButton來確定每個項目是否是一個操作項目,並且如果不刪除該圖標。這樣做有點棘手,因爲onPrepareOptionsMenu被ABS(至少)調用兩次 - 第一次構建動作欄時,MenuItemImpl.isActionButton尚未設置,並且始終返回false。如果是這樣的話,你想要保留圖標。一旦操作欄已經建立,isActionButton方法將返回true對於操作欄項目,否則返回false。所以你想刪除那些返回false的圖標。這是我想出了:

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

你需要這兩個進口:

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

這個作品在ABS 4.3.0,但由於它使用內部庫類可能會與合作其他版本的庫。

相關問題