【问题标题】:Change ActionBar Menu Icons depending on Style根据样式更改操作栏菜单图标
【发布时间】:2023-03-09 01:30:01
【问题描述】:

我想根据我使用的风格(深色或浅色)使用不同的ActionBar 图标。 我无法弄清楚如何,这是我尝试过的:

<style name="AppThemeDark" parent="Theme.Sherlock.ForceOverflow">
    <item name="android:actionButtonStyle">@style/customActionButtonStyleDark</item>
    <item name="actionButtonStyle">@style/customActionButtonStyleDark</item>
</style>

<style name="AppThemeLight" parent="Theme.Sherlock.Light.ForceOverflow">
    <item name="android:actionButtonStyle">@style/customActionButtonStyleLight</item>
    <item name="actionButtonStyle">@style/customActionButtonStyleLight</item>
</style>

<style name="customActionButtonStyleDark" >
    <item name="@drawable/action_search">@drawable/action_search</item>
</style>

<style name="customActionButtonStyleLight" >
    <item name="@drawable/action_search">@drawable/action_search_light</item>
</style>

我也尝试将&lt;item name="@drawable/action_search"&gt;@drawable/action_search&lt;/item&gt; 直接插入主题样式,但没有任何效果。
有什么想法吗?

【问题讨论】:

    标签: android styles android-actionbar actionbarsherlock


    【解决方案1】:

    即使您找到了解决方法,也可能对其他人有所帮助。我在 xml 中找到了一种简单的方法(logcat 的答案是指什么)。我使用的技巧是为我的菜单/操作栏图标创建自定义属性。每个菜单项图标必须有一个属性。

    您需要在您的values 文件夹中创建attrs.xml,并添加您的自定义属性。将每个属性视为您的主题/样式设置的常量,然后您的样式/视图可以使用这些常量来设置属性。

    <declare-styleable name="customAttrs">
        <attr name="customSearchIcon" format="reference" />
    </declare-styleable>
    

    在您的styles.xml 文件夹中的values 文件夹中,将您的自定义图标属性设置为drawable 引用的主题/样式。

    <style name="AppThemeDark" parent="Theme.Sherlock.ForceOverflow">
        <item name="customSearchIcon">@drawable/action_search</item>
    </style>
    
    <style name="AppThemeLight" parent="Theme.Sherlock.Light.ForceOverflow">
        <item name="customSearchIcon">@drawable/action_search_light</item>
    </style>
    

    最后,在 menu 文件夹中的 [menu_name].xml 中,让菜单项将其图标设置为匹配的自定义图标属性。

    <item
        android:id="@+id/menuitem_search" 
        android:icon="?attr/customSearchIcon"/>
    

    现在,根据设置的主题,菜单项的图标会发生变化。此外,这允许您使用资源标识符和drawable 文件夹仍然拥有 API 特定版本的可绘制对象(浅色和深色),因此您可以在 3.0 之前使用不同的菜单样式图标和 3.0+ 的操作栏样式图标。

    另外,请记住,在运行时设置主题时(与 AndroidManifest.xml 相比),您必须在您的 Activity 中调用 setContentView() 之前设置它。建议在更改已创建的Activity 的主题后重新启动您的活动。

    【讨论】:

    • 它工作正常,谢谢!但是如何从 Java 中使用它呢?当我调用 menuLetters.setIcon(R.attr.ic_action_messages);我收到找不到资源的错误。
    • 好问题,我想答案是here。诀窍似乎是你必须告诉 Android 当前设置了什么主题,所以它知道要抓取哪个样式的资源。
    【解决方案2】:

    我认为你没有得到主题 :) 当你尝试这样做时:

    <style name="customActionButtonStyleDark" >
        <item name="@drawable/action_search">@drawable/action_search</item>
    </style>
    

    您正在尝试重载主题中名为“@drawable/action_search”的某些属性

    我有一个坏消息要告诉你,我认为没有这样的消息。所以你可以去主题 Theme.Sherlock.ForceOverflow 和它的父母,看看你可以重载什么。

    如果对您没有帮助,并且您想在主题中为不同的图标设置自定义属性,那就是不同的主题。您需要在 attrs.xml 中创建属性,将您的图标源指向这个新属性并在主题中定义属性值。对于每个不同的按钮。

    【讨论】:

      【解决方案3】:

      解决了,但放弃了尝试使用 XML,我现在以编程方式完成了:

      @Override
          public boolean onCreateOptionsMenu(Menu menu) {
              SharedPreferences prefs = getSharedPreferences("app", 0);
              boolean isDark = "Dark".equals(prefs.getString("theme", "Dark"));
      
              com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
              inflater.inflate(R.menu.main, menu);
      
              // set Icons
              menu.findItem(R.id.menuitem_search).setIcon(isDark ? R.drawable.action_search : R.drawable.action_search_light);
              menu.findItem(R.id.menuitem_add).setIcon(isDark ? R.drawable.content_new : R.drawable.content_new_light);
              menu.findItem(R.id.menuitem_share).setIcon(isDark ? R.drawable.social_share : R.drawable.social_share_light);
              return true;
          }
      

      【讨论】:

        【解决方案4】:

        请参阅博文AppCompat — Age of the vectors (Chris Barnes)中的res/xml/ic_search.xml

        注意对?attr/colorControlNormal的引用

        <vector xmlns:android="..."
            android:width="24dp"
            android:height="24dp"
            android:viewportWidth="24.0"
            android:viewportHeight="24.0"
            android:tint="?attr/colorControlNormal">
            <path
                android:pathData="..."
                android:fillColor="@android:color/white"/>
        </vector>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-20
          • 2014-12-05
          • 1970-01-01
          • 2012-04-13
          相关资源
          最近更新 更多