整理Sherlock Action Bar下拉项的样式

15

我已经努力尝试为添加到操作栏中的下拉列表项设置样式,但是我无法找出正确的代码。

我尝试查看了SherlockActionBar项目中的abs__styles.xmlabs__themes.xml,但是我添加到我的项目中的任何项目都没有生效。

我创建菜单的方式如下:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Sharing icons
        SubMenu submenu = menu.addSubMenu(null);
        submenu.add(getResources().getString(R.string.twitter));
        submenu.add(getResources().getString(R.string.facebook));
        submenu.add(getResources().getString(R.string.email));

        // Share button itself
        MenuItem ShareButton = submenu.getItem();
        ShareButton.setIcon(R.drawable.icon_share_triangle);
        ShareButton.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);

        // Twitter submenu button
        MenuItem TwitterItem = submenu.getItem(0);
        TwitterItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
        TwitterItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                setShareTwitterIntent();
                return true;
            }
        });
...
}

我还尝试过查看这篇文章,使用了下面的代码,但仍然没有成功:

<!-- style the list navigation -->
<style name="MyDropDownNav" parent="android:style/Widget.Holo.Light.Spinner.DropDown.ActionBar">
    <item name="android:background">@drawable/ad_spinner_background_holo_light</item>
    <item name="android:popupBackground">@drawable/ad_menu_dropdown_panel_holo_light</item>
    <item name="android:dropDownSelector">@drawable/ad_selectable_background</item>
</style>

我只需要改变下拉列表中项目的背景颜色。

非常感谢您的帮助!

编辑:

我也尝试了这个,但仍然不起作用:

<item name="android:actionDropDownStyle">@style/MyApp.DropDownNav</item>
<item name="actionDropDownStyle">@style/MyApp.DropDownNav</item>
...
<style name="MyApp.DropDownNav" parent="Widget.Sherlock.Light.Spinner.DropDown.ActionBar">
        <item name="android:background">@drawable/sharing_panel</item>
</style>

你的自定义主题是否派生自Theme.Holo.Light.DarkActionBar? - Ifrit
你的问题解决了吗? - Spike
这个在我的项目中被推迟了,因为它是低优先级的,但是一旦我解决了它,我会让你们知道的。 - noloman
5个回答

27

我曾经遇到同样的问题,而且在长时间的思考之后——就像一只患有跳蚤病的狗般的抓狂——我终于解决了它。这是使用ABS 4.1(90)时的情况。以下代码将更改下拉项的背景颜色。

SomeActivity.java

Context context = ab.getThemedContext();
ArrayAdapter<CharSequence> list = ArrayAdapter.createFromResource(
    context, R.array.map_activity_view_list,
    R.layout.sherlock_spinner_item);
list.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item);
注意:您需要使用 R.layout.sherlock_spinner_item 作为createFromResource,以及使用 R.layout.sherlock_spinner_dropdown_item 作为setDropDownViewResource。这是在ABS源代码中示例显示的内容:https://github.com/JakeWharton/ActionBarSherlock/blob/master/samples/demos/src/com/actionbarsherlock/sample/demos/ListNavigation.java 这是因为当 sherlock_spinner_item 布局未被选中时,操作栏中的下拉菜单使用此布局,而实际的下拉菜单项使用 sherlock_spinner_dropdown_item 布局,这意味着每个样式都不同:
- sherlock_spinner_item - android:spinnerItemStyle - spinnerItemStyle - sherlock_spinner_dropdown_item - android:spinnerDropDownItemStyle - spinnerDropDownItemStyle 请记住,两种样式都是必需的-带有android前缀的样式用于本机ICS ActionBar,没有android前缀的样式用于早于ICS的设备上的AcrionBarSherlock风格。
res/values/styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Theme.MyApp" parent="Theme.Sherlock.Light">
        <!--  the text when loading -->
        <!--
        <item name="actionBarStyle">@style/Widget.MyApp.ActionBar</item>
        <item name="android:actionBarStyle">@style/Widget.MyApp.ActionBar</item>
        -->

        <!-- the dropdown items -->
        <item name="android:spinnerDropDownItemStyle">@style/MyApp.Widget.Holo.DropDownItem</item>
        <item name="spinnerDropDownItemStyle">@style/MyApp.Widget.Holo.DropDownItem</item>

        <!--  the action bar dropdown menu item -->
        <!-- 
        <item name="android:spinnerItemStyle">@style/MyApp.Widget.Holo.SpinnerItem</item>
        <item name="spinnerItemStyle">@style/MyApp.Widget.Holo.SpinnerItem</item>
        -->
    </style>

    <style name="Widget.MyApp.ActionBar" parent="Widget.Sherlock.Light.ActionBar">
        <item name="titleTextStyle">@style/Widget.MyApp.TitleTextStyle</item>
        <item name="android:titleTextStyle">@style/Widget.MyApp.TitleTextStyle</item>
    </style>

   <style name="Widget.MyApp.TitleTextStyle" parent="TextAppearance.Sherlock.Widget.ActionBar.Title">
    <item name="android:textColor">@color/orange</item>
    </style>

   <style name="MyApp.Widget.Holo.DropDownItem" parent="Widget.Sherlock.Light.DropDownItem.Spinner">
       <item name="android:background">@color/orange</item>
    </style>

   <style name="MyApp.Widget.Holo.SpinnerItem" parent="Widget.Sherlock.TextView.SpinnerItem">
       <item name="android:background">@color/orange</item>
    </style>

</resources>

res/values/color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

 <color name="orange">#ffEf4f1f</color>

</resources>
请标记为答案,如果这个解决了你的问题。谢谢!
链接:
浏览样式: https://github.com/JakeWharton/ActionBarSherlock/blob/master/actionbarsherlock/res/values/abs__styles.xml 浏览主题: https://github.com/JakeWharton/ActionBarSherlock/blob/master/actionbarsherlock/res/values/abs__themes.xml

2
不,它不像你说的那样工作。尽管如此,我更新了我的帖子,展示了我如何创建菜单。 - noloman
奇怪,这在我的项目中可行。也许你的样式/主题有其他更改影响了它。 - RidingTheRails
关键是使用getThemedContext()而不仅仅是传递活动。谢谢! - phreakhead

4

要更改Sherlock Action Bar(v4.1.0)中菜单项的背景可绘制,请使用以下方法:

<style name="My_Theme" parent="Theme.Sherlock">
  <item name="android:popupMenuStyle">@style/MyApp.PopupMenuStyle</item>
  <item name="popupMenuStyle">@style/MyApp.PopupMenuStyle</item>
</style>

<style name="MyApp.PopupMenuStyle" parent="Widget.Sherlock.ListPopupWindow">
  <item name="android:popupBackground">@drawable/menu_item_background</item>
</style>

希望这可以帮到你。

3
我用过这个,对我很有帮助。
<style name="MyDropDownItem" parent="Widget.Sherlock.Spinner.DropDown.ActionBar">
    <item name="android:background">@drawable/spinner_background_holo_light</item>
    <item name="android:popupBackground">@color/actionbar_normal</item>
    <item name="android:dropDownSelector">@drawable/list_selector_holo_light</item>
</style>

<style name="myTheme" parent="@style/Theme.Sherlock">
    ...
    ...
    ...
    <item name="android:actionDropDownStyle">@style/MyDropDownItem</item>
    <item name="actionDropDownStyle">@style/MyDropDownItem</item>
</style>

在这里,

"spinner_background_holo_light" 和 "list_selector_holo_light" 是选择器。

而且,

"actionbar_normal"是可绘制的(图片或颜色)。


2

我不确定这个问题是否已经得到令人满意的答复,但我遇到了这个问题,并没有找到一个我喜欢的答案。似乎我的ActionBarSherlock配置非常标准,使用下拉导航框架时默认显示黑色背景上的黑色文本。我想让文本变成白色。以下是我的解决方法:

首先,我的应用程序基础主题扩展了Theme.Sherlock:

<style name="AppBaseTheme" parent="Theme.Sherlock">
</style>

我的实际应用程序主题AppTheme扩展了我的基础主题(我不记得当时为什么这样做,可能是不必要的)。

注:base指的是基础主题。
<style name="AppTheme" parent="AppBaseTheme">
    <item name="spinnerItemStyle">@style/SpinnerItemStyle</item>
    <item name="android:spinnerItemStyle">@style/SpinnerItemStyle</item>
</style>

我需要重写 Widget.Sherlock.TextView.SpinnerItem,代码如下:

<style name="SpinnerItemStyle" parent="Widget.Sherlock.TextView.SpinnerItem">
<item name="android:textAppearance">@style/TextAppearance.MySpinnerItem</item>
</style>

这样做的原因是为了访问TextApperance小部件:TextAppearance.Sherlock.Widget.TextView.SpinnerItem

如下所示进行了覆盖:

<style name="TextAppearance.MySpinnerItem"    parent="TextAppearance.Sherlock.Widget.TextView.SpinnerItem">
  <item name="android:textColor">#FFFFFF</item>
  <item name="android:textSize">16sp</item>
  <item name="android:textStyle">normal</item>
</style>

在尝试修复这个问题时,我最大的错误是尝试直接在覆盖的SpinnerItemStyle中设置textColor。由于它使用了textAppearance widget,所以它根本不起作用。

然后让我的代码像这样(在我的activity的onCreate方法中):

SpinnerAdapter spinnerAdapter = ArrayAdapter.createFromResource(this,
            R.array.call_type, R.layout.sherlock_spinner_item);

OnNavigationListener onNavigationListener = new OnNavigationListener() {
        // Get the same strings provided for the drop-down's ArrayAdapter
        String[] strings = getResources().getStringArray(R.array.call_type);

        @Override
        public boolean onNavigationItemSelected(int position, long itemId) {
            String filter = strings[position];
            filterCalls(filter);
            return true;
        }
    };

ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
    actionBar.setListNavigationCallbacks(spinnerAdapter,
            onNavigationListener);

这使我能够使用ActionBarSherlock更改下拉菜单中的文本颜色。


0

ActionBarSherlock要求你使用其3个主题之一。不过,你可以通过继承这些主题并覆盖下拉菜单样式来进行修改,例如:

<style name="MySherlockLightTheme" parent="Theme.Sherlock.Light">
   <item name="actionDropDownStyle">@style/MyDropDownNav</item>
</style>

假设您想要使用Holo Light主题,并且您的下拉菜单样式是MyDropDownDav。

然后在您的代码中,您只需切换使用您的主题(可以在清单文件中或在Activity的onCreate方法中实现)。


确保您还放置了 <item name="android:actionDropDownStyle">@style/MyDropDownNav</item> 这一行,以便原生操作栏在蜂巢和更高版本上也会使用它。 - Karakuri
我做了一个 <style name="MyTheme" parent="Theme.Sherlock.Light"><item name="actionDropDownStyle">@drawable/sharing_panel_correct</item> <item name="android:actionDropDownStyle">@drawable/sharing_panel_correct</item></style> 但它仍然不起作用,没有任何区别。 - noloman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接