2012-09-28 108 views
25

是否可以將彈出式菜單樣式從白色背景上的默認黑色文本更改爲黑暗背景,而無需將樣式應用於整個活動(這打破了我的UI)?如何設計PopupMenu?

+0

我做的東西simil在這裏! http://stackoverflow.com/questions/16621070/get-context-of-popupmenu-like-contextmenu – toobsco42

回答

3

是的,你可以

<style name="YOURSTYLE" parent="Widget.AppCompat.PopupMenu"> 
    <item name="android:textColor">@android:color/white</item> 
    <item name="android:itemBackground">@android:color/holo_red_light</item> 
</style> 

而且

Context wrapper = new ContextThemeWrapper(this, R.style.YOURSTYLE); 
PopupMenu popup = new PopupMenu(wrapper, view); 

結果

custom PopupMenu style in Android

42

您不能直接設置PopupMenu樣式,但還有其他方法。

PopupMenu創建方式如下:

PopupMenu popupMenu=new PopupMenu(context, anchorView); 

菜單的樣式由上下文傳遞的風格決定的。所以你所要做的就是傳遞你的Activity參考作爲上下文,菜單將被相應地設置。

如果要定義自己的風格,從默認的一個繼承你的活動方式和覆蓋以下項目:

<style name="style" parent="android:Theme.Holo.Light"> 
    <item name="android:popupMenuStyle">...</item> 
    <item name="android:popupAnimationStyle">...</item> 
    <item name="android:popupBackground">...</item> 
    <!-- etc etc --> 
</style> 
+4

什麼值代替「....」。 我試過------------------------ @ android:color/holo_red_light - ----------------------------我在彈出菜單中看不到任何變化[我沒有使用其他兩個屬性] - ---------------------- 而且我將這種風格分配爲活動風格。請告訴我我做錯了什麼? – Santosh

+1

@Santosh checkout http://stackoverflow.com/questions/22320663/change-background-popupmenu-in-android –

28

添加到什麼Deville建議,你也可以添加以下屬性你的主題風格。

在我的XML樣式定義在上面的樣式定義

<style name="myPopupMenuStyle" parent="@style/Widget.AppCompat.Light.PopupMenu"> 

</style> 
<style name="myPopupMenuTextAppearanceSmall" parent="@style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Small"> 
    <item name="android:textColor">#000000</item> 
</style> 
<style name="myPopupMenuTextAppearanceLarge" parent="@style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Large"> 
    <item name="android:textColor">#000000</item> 
</style> 

引用你會發現程序兼容性

<style name="style" parent="android:Theme.Holo.Light">   
    <!-- other attributes --> 
    <item name="textAppearanceLargePopupMenu">@style/myPopupMenuTextAppearanceLarge</item> 
    <item name="android:textAppearanceLargePopupMenu">@style/myPopupMenuTextAppearanceLarge</item> 

    <item name="textAppearanceSmallPopupMenu">@style/myPopupMenuTextAppearanceSmall</item> 
    <item name="android:textAppearanceSmallPopupMenu">@style/myPopupMenuTextAppearanceSmall</item> 

    <item name="popupMenuStyle">@style/myPopupMenuStyle</item> 
    <item name="android:popupMenuStyle">@style/myPopupMenuStyle</item> 
</style> 

其他風格,那是因爲我使用的是Android的支持庫目標下的Android API級別。

+0

你知道我怎樣才能改變使用支持庫的彈出菜單的背景顏色? thx – Sandra

+0

這將刪除彈出框的邊框。 – AndroidDev

+0

這個工程,但我改變了我的最低SDK從10到11 –

6

使用ActionBar的同樣情況下創建PopupMenu

actionBar.getThemedContext()

所以,

ActionBar actionBar = ((ActionBarActivity) getActivity()).getSupportActionBar(); 
PopupMenu popMenu = new PopupMenu(actionBar.getThemedContext(), someView); 
+1

你假設使用Actionbar。彈出窗口可以在沒有操作欄的情況下使用。 – AndroidDev

+0

即使使用工具欄,如果它設置爲支持Actionbar,它也可以很好地工作。謝謝。 – buggydroid

9

可以很明顯的定製的彈出菜單中你自己辦法。它非常簡單。但首先你需要照顧一件非常重要的事情。

的彈出菜單是這樣的創建,

PopupMenu popupMenu = new PopupMenu(context, anchorView); 

現在的「語境」在這裏扮演的造型非常重要的作用。 PopupMenu的風格取決於您傳遞的上下文的樣式。所以要非常小心。我幾乎花了半小時才弄清楚這一點。

如果你在一個片段只是通過「getActivity()」,你就完成了。

造型的彈出菜單項

只是覆蓋在你的風格以下項目,

<item name="textAppearanceLargePopupMenu">@style/myPopupMenuTextAppearanceLarge</item> 
<item name="android:textAppearanceLargePopupMenu">@style/myPopupMenuTextAppearanceLarge</item> 

<item name="textAppearanceSmallPopupMenu">@style/myPopupMenuTextAppearanceSmall</item> 
<item name="android:textAppearanceSmallPopupMenu">@style/myPopupMenuTextAppearanceSmall</item> 

和定製你想要的文本外觀,

<style name="myPopupMenuTextAppearanceSmall" parent="@style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Small"> 
      <item name="android:textColor">@color/text_hint_color</item> 
</style> 

<style name="myPopupMenuTextAppearanceLarge" parent="@style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Large"> 
      <item name="android:textColor">@color/text_hint_color</item> 
</style> 

如果你想改變PopupMenu的背景,這樣做

<item name="popupMenuStyle">@style/myPopupMenuStyle</item> 
    <item name="android:popupMenuStyle">@style/myPopupMenuStyle</item> 

高級造型

的彈出菜單項不支持默認顯示的圖標。但顯示圖標可以使它看起來好多了。我建議嘗試一下。

爲了實現這個剛剛把下面的代碼在你的活動,你是好去,

@Override 
public boolean onMenuOpened(int featureId, Menu menu) { 
    if (featureId == Window.FEATURE_ACTION_BAR && menu != null) { 
     if (menu.getClass().getSimpleName().equals("MenuBuilder")) { 
      try { 
       Method m = menu.getClass().getDeclaredMethod(
         "setOptionalIconsVisible", Boolean.TYPE); 
       m.setAccessible(true); 
       m.invoke(menu, true); 
      } catch (NoSuchMethodException e) { 
       Log.e("tag", "onMenuOpened", e); 
      } catch (Exception e) { 
       throw new RuntimeException(e); 
      } 
     } 
    } 
    return super.onMenuOpened(featureId, menu); 
} 

希望它可以幫助大家。謝謝。

+0

啓用圖標的這種實現方式並不適用於我,所以請參閱本文後面的dgtale的回答:http://stackoverflow.com/questions/6805756/is-it-possible-to-display-icons-in-a-popupmenu – Ivan