如何在Android中突出显示操作栏选项?

3

我正在创建一个应用程序,其中在操作栏中有三个项目。当我点击其中一个项目时,我希望它可以被突出显示。

我查看了一些可用的示例,得出结论我需要使用 ActionBar Style Generator 工具来创建样式。

我参考了以下链接,但并不满意:

如何在选择时突出显示菜单项?

这是唯一的解决方法吗?

<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:actionBarItemBackground">@drawable/action_bar_item_selector</item>
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>

selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item
    android:state_focused="true"
    android:drawable="@drawable/ic_action_blue" />
  <item android:state_pressed="true"
    android:drawable="@drawable/ic_action_green" />
  <item android:drawable="@android:color/transparent" />
</selector>

但是选择状态并不像state_pressed和state_focused一样保持不变。

我希望当用户在该活动上时,该项目仍然保持突出显示。

4个回答

4
更加优雅的处理问题的方式,是简单地使用布尔值来检查两种状态。如果您正在使用不同状态颜色的相同可绘制对象,则建议使用colorFilter方法应用于您的可绘制对象。
 private boolean mSomeValue = true; 

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
      // determine the menu item you want to highlight when selected
      switch(item.getItemId) {
           case yourItem : {
                if (mSomeValue) {
                    item.getIcon().setColorFilter(YourColor, PorterDuff.Mode.MULTIPLY);
                    mSomeValue = false;
                } else {
                    mSomeValue = true;
                    item.getIcon().setColorFilter(Default, PorterDuff.Mode.MULTIPLY);
                }
            break; ...
           }
      }
      return super.onOptionsItemSelected(item);
 }

这在使用像android:icon="@android:drawable/ic_menu_view"这样的图标以及Color.DKGRAY来模拟按下状态和clearColorFilter()用于正常状态时特别好用。 - E.S.

1
你可以定义一个主题并继承你想要的操作栏主题(例如Theme.Sherlock.Light.DarkActionBar),将android:actionBarItemBackground属性的值设置为覆盖继承主题中的默认值。
<style name="MyTheme" parent="Theme.Sherlock.Light.DarkActionBar">
    <item name="android:actionBarItemBackground">custom_selector</item>
</style>

检查一下我的新答案! - S.Thiongane

0

好的,我建议您在menu.xml中创建两个不同的项目:

<item
    android:id="@+id/action_item1" 
   /> 


<item 
    android:id="@+id/action_item2"
    android:visible="false"
    />

然后,在您想要突出显示项目的活动中,覆盖ononPrepareOptionsMenu,使用menu参数通过使用menu.findItem(R.id.your_item_id)来捕获所需的项目。最后切换您的项目的可见性。

您需要使用invalidateOptionsMenu自动刷新操作栏项目。

如果有帮助,请告诉我!


0
我正在创建一个应用程序,其中在操作栏中有三个项目。我希望当我点击其中一个项目时,它会被突出显示。
我不确定以下内容是否能正常工作:
为每个菜单项创建两组图标:一个用于默认外观,另一个用于突出显示(以您认为合适的任何方式:更改颜色、更改背景颜色等)。声明一个全局Menu变量来保存菜单项:
// Global variable // Not good practice, but needed in this case
Menu mainMenu;

....
....

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_name, menu);

    mainMenu = menu;

    return true;
}

onMenuItemSelected(int featureId, MenuItem item)方法中:
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {

    for (int i = 0; i < mainMenu.size(); i++) {

        // Set default icons
        if (mainMenu.getItem(i).getItemId() == R.id.action1) {
            mainMenu.getItem(i).setIcon(R.drawable.icon_default1);
        } else if (mainMenu.getItem(i).getItemId() == R.id.action2) {
            mainMenu.getItem(i).setIcon(R.drawable.icon_default2);
        } else if (.....) {
            .....
        }
    }

    if (item.getItemId() == R.id.action1) {
        item.setIcon(R.drawable.icon_highlighted1);
    } else if (item.getItemId() == R.id.action2) {
        item.setIcon(R.drawable.icon_highlighted2);
    } else if(.....) {
        .....
    }

    return super.onMenuItemSelected(featureId, item);
}

我猜你可以通过在for循环内部检查item.getItemId()来微调此操作。


这似乎完美地运行了。但这是唯一的方式吗? - android developer
@anuja “这似乎完美地运作了。但这是唯一的方法吗?”在我看来,这更像是一个解决问题的权宜之计。我不确定是否存在其他解决方案。 - Vikram

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