如何使操作栏图标在单击时发生变化

2024-01-22

我在 Sherlock ActionBar 中有一组紫色背景的白色图标

我想让它们在被点击时变成深紫色。

我有相同的深紫色图标,所以我想让这些可绘制对象显示在按下状态。

现在,我知道如何在整个应用程序主题中执行此操作,但这意味着我必须对所有图标使用相同的可绘制对象。

我想知道如何为每个项目的按下状态分配不同的可绘制对象。

这是我现在使用的代码:

在 styles.xml 中

<style name="Theme.SherlockCustom" parent="@style/Theme.Sherlock.Light">
    <item name="actionBarItemBackground">@drawable/action_bar_item_background</item>
    <item name="android:icon">@android:color/transparent</item>
    <item name="displayOptions">showCustom</item>
    <item name="android:minWidth">0dp</item>
    <item name="android:padding">0dp</item>
</style>

action_bar_item_background.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/light_purple" android:state_pressed="true"/>
 <!-- pressed -->
    <item android:drawable="@android:color/transparent"/>
 <!-- default -->

</selector>

这是不起作用的部分(尝试设置一个样式来定义特定按钮的新外观):

feed_icon.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:drawable="@drawable/ic_action_content_paste"
        android:right="@dimen/action_bar_icons_padding_right"
        android:theme="@style/feediconstyle"></item>


</layer-list>

和样式/ feediconstyle:

<style name="feediconstyle" parent="@style/Theme.Sherlock.Light">
    <item name="actionBarItemBackground">@drawable/feed_icon_background</item>
    <item name="displayOptions">showCustom</item>
</style>

这个特殊的图标不符合新的风格,即

feed_icon_background:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/feed_icon_purple" android:state_pressed="true"/>
 <!-- pressed -->
    <item android:drawable="@android:color/transparent"/>
 <!-- default -->

</selector>

那么我该怎么做呢?


我想符合“我没有使用 ActionBarSherlock 仅使用标准操作栏检查这一点”

也就是说,我知道这将在标准操作栏上运行,并且没有理由在 ActionBarSherlock 中不起作用。

在我的活动的 onCreate 中(我正在使用徽标属性,但它也适用于 MenuItems)

    getActionBar().setLogo(R.drawable.logo);
    getActionBar().setDisplayUseLogoEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

在 logo.xml 中我有一个选择器

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" 
          android:drawable="@drawable/logopressed"/>
    <item android:drawable="@drawable/logonotpressed" />
</selector>

在logopressed.xml中可以使用图层列表来制作背景

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@android:color/holo_purple" />
    <item
        android:drawable="@drawable/logo_normal" />   
</layer-list>

在 logonotpressed.xml 中根据需要切换背景颜色和/或可绘制图标

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@android:color/white" />
    <item
        android:drawable="@drawable/logo_inverted" />   
</layer-list>

所以这个解决方案的关键是设置选择器可绘制并让它为每个状态选择一个全新的可绘制,而不是将选择器可绘制设置为其他静态变量的背景属性

注意:您应该能够使用背景来主题化项目,而不是做 2 层,但我无法让它工作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使操作栏图标在单击时发生变化 的相关文章

随机推荐

  • Xcode 8 beta 6 - 架构的冲突值

    我尝试使用 Xcode beta 6 在设备上安装我的应用程序 但它在链接阶段失败并出现以下错误 ld linking module flags Objective C Class Properties IDs have conflicti
  • 应用两个数据框

    我正在使用 R 并且我有两个 data frames A and B 它们都有 6 行 但是A有 25000 个列 基因 并且B有 30 列 我想应用一个带有两个参数的函数f x y where x是每一列A and y是每一列B 到目前为
  • C# 将列表拆分为 n 组的所有组合 - 来自 Python 的代码迁移

    我所追求的算法有一个很好的实现here https stackoverflow com questions 39192777 python split a list into n groups in all possible combina
  • 扩展 Laravel 核心日志记录

    我回来时遇到了更多 Laravel 问题 因为我在理解事物方面遇到了问题 再次 我尝试创建一个包来进行我自己的日志记录 在进行了一些额外的阅读 浏览核心代码并尝试其他方法之后 我得出的结论是 我需要做的就是扩展 laravel 日志记录的核
  • 加载内容后显示引导模式

    我正在使用 Bootstrap 3 模式 其中我从 getJson 函数加载一些数据 由于模式内的数据加载速度不一样快 我想显示加载图像 文本 加载所有数据后 然后显示 打开模式 我找到了这个Thread https stackoverfl
  • Html显示格式化文本

    我必须在 html 页面上显示一堆文本 文本看起来像这样 001 This is a Line 00 12 04 002 003 Everthing looks good so far 文本是 预先格式化的 包含大量空格和破折号 每行都具有
  • JQuery 到 asmx 在 Windows 2008 R2 SP1 上失败

    自从安装 SP1 以来 我们在从 JQuery 客户端代码调用 asmx 页面时遇到了问题 IIS 将 JQuery post 调用指向他的默认 404 页面 我们对环境进行了角色恢复 断言此问题是由 SP1 引起的 并且测试证实了这一点
  • mongodb-java POJO不返回id

    我是 MongoDB 的新手 在这里有点疯狂 我正在使用最新的 mongo java driver 版本和 dropwizard 我使用 POJO 写入 DDBB 它有效 但是 当尝试获取元素时 我没有得到实际的 id 这是我尝试过的 DD
  • 如何在数字的最后三位数字之前插入小数点?

    我有一个数字 需要添加小数以进行格式化 该数字保证在 1000 到 999999 之间 我已经以其他方式介绍了其他可能性 这是我无法理解的 我需要在最后 3 位数字之前添加小数 例如 1000 gt 1 000 23513 gt 23 51
  • 我可以向 HTML 标记添加自定义属性吗?

    我可以向 HTML 标记添加自定义属性吗 如下所示
  • 在 Google App Engine 中创建表单自动完成

    我想为标签字段构建一个自动完成功能 就像 App Engine 上的 SO 一样 知道我应该如何进行这个过程吗 服务器端算法 自动完成应该有什么逻辑 应用程序引擎实施 数据存储架构应该是什么 嘿 几天前我就遇到了这个问题 只要您有想要搜索的
  • 如何在 ASP.Net Core Razor 页面中返回带有模型的页面

    如何重定向到页面并传递其模型 就像我们在 MVC 中所做的那样return View model MyModel 我尝试过的 return RedirectToPage Notify new Model notifierVM 注意 我要返回
  • 如何立即关闭 C 程序?

    我正在编写 C 代码 在其中分析一些数据 我已将程序设置为仅处理 100 个数据输入 当输入超过 100 个时 就会出现分段错误 我想创建一种方法 以便当输入数量超过 100 时 用户将收到警告并且程序将终止 我知道如何从主要功能中简单地做
  • MyGroups 未在 Communicator.UIAutomation 中实现

    我正在开发一个浏览器外的 Silverlight 应用程序 它提供了一些 MS Office Communicator 2007 控件 我正在使用 与 SDK 一起安装的文档指出 IMessenger2 界面中有一个 MyGroups 属性
  • 测试 swift 异步函数超时

    如何编写一个单元测试来检查异步函数是否不会超时 我正在尝试常规XCTestExpectation 但是因为await暂停一切 是等不到期待 在下面的代码中 我正在检查loader perform 执行时间不超过1秒 func testLoa
  • 在 KnockoutJS 中获取可观察的多维数组(对象)

    我正在使用 Knockout 构建一个应用程序 发现它非常有用 虽然 我在获取多维数组 对象 可观察时遇到问题 目前我正在使用以下结构 self form ko observableArray ko utils arrayMap initi
  • /bin/sh: python: 找不到命令

    我刚刚安装了 Python3 和 Komodo 我正在尝试运行一个简单的脚本 但收到 py 命令未找到的错误 我对 Komodo 和 Python 都是新手 所以不知道该去哪里寻找 我看到另一篇文章也有同样的问题 但没有提供有帮助的解决方案
  • 虚拟继承的内部机制

    C 示例代码 class A public A int class B public virtual A public B int b A b class C virtual public A public C int c A c clas
  • 在 jQuery Mobile 中的 Ajax 调用上显示页面加载微调器

    我正在使用 ajax 填充我的移动网络应用程序中的列表 我想做的是让 jQuery 移动加载微调器在执行此调用时出现 并在列表填充后消失 当前版本的 JQM 使用 mobile showPageLoadingMsg and mobile h
  • 如何使操作栏图标在单击时发生变化

    我在 Sherlock ActionBar 中有一组紫色背景的白色图标 我想让它们在被点击时变成深紫色 我有相同的深紫色图标 所以我想让这些可绘制对象显示在按下状态 现在 我知道如何在整个应用程序主题中执行此操作 但这意味着我必须对所有图标