无法将 colorFilter 应用于文本选择手柄

2024-01-05

我正在尝试将材质文本选择句柄引入我的应用程序。我从 SDK 中获取了中/右/左手柄(位图)和文本光标(9 块)的可绘制对象,并设置:

<item name="android:textSelectHandleLeft">@drawable/text_select_handle_left_mtrl_alpha</item>
<item name="android:textSelectHandleRight">@drawable/text_select_handle_right_mtrl_alpha</item>
<item name="android:textSelectHandle">@drawable/text_select_handle_middle_mtrl_alpha</item>
<item name="android:textCursorDrawable">@drawable/text_cursor_mtrl_alpha</item>

它按预期工作。然而,在 Lollipop 中,这些可绘制对象在 XML 中使用特定颜色着色android:tint属性,我无法在 API

  • 文本光标不会着色。我认为这可能是因为它是 9 补丁。如何在运行时过滤 9 补丁可绘制对象?我可能尝试了所有PorterDuff.Modes.

  • 右/左手柄为黑色,中间手柄为白色。

也就是说,它们都不是我想要的绿色。为什么?

正如你在上面看到的,我设置了四个ImageView在我的编辑文本下方,它们反而被着色。

   private void setUpTextCursors() {
        Drawable left = getResources().getDrawable(R.drawable.text_select_handle_left_mtrl_alpha);
        Drawable right = getResources().getDrawable(R.drawable.text_select_handle_right_mtrl_alpha);
        Drawable middle = getResources().getDrawable(R.drawable.text_select_handle_middle_mtrl_alpha);
        Drawable cursor = getResources().getDrawable(R.drawable.text_cursor_mtrl_alpha);
        ColorFilter cf = new PorterDuffColorFilter(mGreenColor, PorterDuff.Mode.SRC_IN);

        /**
        * tint my ImageViews, but no effect on edit text handles
        */
        left.setColorFilter(cf); 
        right.setColorFilter(cf);
        middle.setColorFilter(cf);

        /**
        * no effect whatsoever
        */
        cursor.setColorFilter(cf);
   }

看起来这里我们既有一个 9 补丁着色问题 - 因为过滤器即使在测试 ImageView 上也失败 - 以及一个与文本选择管理器没有考虑任何应用的过滤器这一事实相关的问题。

相关源代码来自TextView class https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/TextView.java并由此Editor hidden 辅助类 http://my.fit.edu/~vkepuska/ece5570/adt-bundle-windows-x86_64/sdk/sources/android-16/android/widget/Editor.java我以某种方式找到了它。花了一些时间,但仍然不明白为什么我的过滤器被忽略。


致@pskink:让cursor是过滤后的可绘制对象,我可以有:

<ImageView
    android:id="@id/1"
    android:src="@drawable/cursor_drawable" />

<ImageView 
    android:id="@id/2" />

第一个不会着色,但如果我打电话imageView2.setBackground(cursor),然后就着色了。 另外如果我有

<item name="android:textSelectHandle">@drawable/cursor_drawable</item>

这会影响编辑选择(因为我覆盖了默认光标),但它再次没有着色。


您需要覆盖您的活动使用的默认资源:

// your activity source file
Resources res;

@Override
public Resources getResources() {
    if (res == null) {
        res = new TintResources(super.getResources());
    }
    return res;
}

自定义资源类将覆盖getDrawable()方法,以便您可以拦截创建 Drawables 并设置颜色过滤器,例如:

class TintResources extends Resources {

    public TintResources(Resources resources) {
        super(resources.getAssets(), resources.getDisplayMetrics(), resources.getConfiguration());
    }

    @Override
    public Drawable getDrawable(int id) throws NotFoundException {
        Drawable d = super.getDrawable(id);
        if (id == R.drawable.text_cursor_material) {
            // setup @drawable/text_cursor_material
            d.setColorFilter(0xff00aa00, PorterDuff.Mode.SRC_IN);
        }
        return d;
    }
}

您可以以同样的方式设置其他 Drawables (@drawable/text_select_handle_*_material),请注意,您需要的不是直接方式,因为 EditText 没有用于访问这些 Drawables 的 getter 方法

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

无法将 colorFilter 应用于文本选择手柄 的相关文章

  • Google Map Android API v2 无法在 Play 商店应用程序中显示地图

    我正在与Google Map Android API v2在 Android 应用程序中 它可以很好地与未签名的应用程序在不同的设备上 但是 当我签署 apk 并将应用程序上传到 Play 商店时 下载的应用程序显示白屏而不是地图 您使用什
  • SpinnerAdapter 中 getView 和 getDropDownView 的区别

    当你实现 SpinnerAdapter 时 你会得到获取下拉视图 http developer android com reference android widget SpinnerAdapter html getDropDownView
  • 在 Java/Android 中检查字符串是否包含 URL 的最佳方法是什么?

    在 Java Android 中检查字符串是否包含 URL 的最佳方法是什么 最好的方法是检查字符串是否包含 com net org info 其他 或者有更好的方法吗 url 输入到 Android 中的 EditText 中 它可以是粘
  • 未找到 ADB screenrecord 命令

    我无法奔跑adb shell screenrecord sdcard my mp4 我尝试运行此命令的设备规格 Honor 5C 安卓6 0 每当我运行 screenrecord 命令时 它都会显示未找到命令 D adb gt adb sh
  • 如何在 PercentRelativeLayout 中使用layout_aspectRatio?

    我尝试在视图上实现 16 9 的纵横比PercentRelativeLayout https developer android com reference android support percent PercentRelativeLa
  • 相机预览的有效模糊

    到目前为止我尝试过的 将每一帧转换为位图 然后用library https github com wasabeef Blurry并将其放入ImageView这是在相机预览前 显然太慢了 就像1 fps 然后我开始使用渲染脚本这会模糊每一帧
  • Android:如何根据视图模型实时数据属性为片段编写单元测试?

    我的片段 UI 中有一个列表视图 其元素集取决于来自视图模型 LiveData 属性的值的状态 我想为片段创建工具测试 该片段包含与该属性的值集相关的 3 个场景测试用例 但我不知道从哪里开始 我的代码应该如下所示 class MyView
  • 使用 Kotlin 协程替换 LocalBroadcastManager 以进行 Firebase 消息传递

    使用时Firebase 云消息传递 https firebase google com docs cloud messaging android client在 Android 上 通常需要通知当前Activity传入的推送通知 推荐的方法
  • 在 Android 中完成一项活动?

    我有一些活动 Home Activity gt Activity 1 gt Activity 2 gt Activity 3 gt HomeActivity finish finish finish Home Activity gt Act
  • 重置首选项的默认值

    我正在使用 CheckBoxPreference 作为设置屏幕 XML 是
  • 如何在Android项目中使用libffmpeg.so?

    我正在尝试在 Android 中创建一个屏幕录制应用程序 为此 我使用 FFmpeg 我已经创建了 libffmpeg so 文件 现在我想在 Android 项目中使用相同的方法来调用它的本机函数 我怎样才能做到这一点 本教程提供了有关此
  • 迭代 Sqlite-query 中的行

    我有一个表布局 我想用数据库查询的结果填充它 我使用全选 查询返回四行数据 我使用此代码来填充表行内的 TextView Cursor c null c dh getAlternative2 startManagingCursor c th
  • 改造添加带有令牌和 ID 的标头

    我在获取经过身份验证的用户时遇到问题 在此之前我得到了令牌和用户 ID 现在我需要使用访问令牌和 ID 从服务器获取用户 我有标题格式 https i stack imgur com OQ87Y png 现在我尝试使用拦截器添加带有用户令牌
  • Android 改造参数化@Headers

    我正在使用 OAuth 每次发出请求时都需要将 OAuth 令牌放入标头中 我看到 Header注释 但是有没有办法让它参数化 以便我可以在运行时传入 这是概念 Header Authorization OAuth var api vers
  • Android Studio 3.0 - 设置未保存

    我已将 文件 gt 设置 gt 编辑器 gt 代码样式 中的 右边距 列 从默认的 100 增加到 140 不幸的是 每次重新启动 Android Studio 后 该边距都会重置 我还尝试导出和导入我的设置 但这并不能阻止重置右边距 希望
  • Android:如何停止监听电话监听器? [复制]

    这个问题在这里已经有答案了 可能的重复 Android 为什么 PhoneCallListener 在活动完成后仍然存在 https stackoverflow com questions 11666853 android why phon
  • 什么是“多重”启动模式?

    On http developer android com guide topics manifest activity element html http developer android com guide topics manife
  • Android:列表视图崩溃

    我正在使用 android listview 并且它工作得很好 我的实现如下 ListView listview ListView findViewById R id list setListAdapter new ArrayAdapter
  • Android 预安装检测

    我的 Android 应用程序将被预安装 我想继续跟踪预安装的应用程序 为此 我需要以某种方式保存密钥或标志 这意味着该应用程序是预安装的 我会将此密钥添加到后端的每个请求中并对其进行分析 我对此有疑问 有一个问题是关于从 Google P
  • 没有 Google Play 服务的设备的后备计划是什么

    目前 我正在将以前使用 jar 库的 Google 服务迁移到 Google Play 服务 谷歌广告移动 谷歌分析 谷歌云端硬盘 然而 在迁移指南中 Google 没有提到对于没有 Google Play 服务或没有最新的 Google

随机推荐

  • 将 FFmpeg 与 Android-NDK 结合使用

    我想用FFmpeg with Android NDK我在这方面非常基础 我需要一些帮助 我之前在网上研究过这个主题 但没有得到令人满意的解决方案 1 我如何使用FFmpeg通过 Windows 操作系统 我不想使用Ubuntu 请不要建议
  • 允许在url重写中使用中文字符

    我写了 URL 重写规则
  • 在 GDB 中搜索源目录

    如何告诉 nix 中的 GDB 在单个目录中递归搜索源文件 例如 如果一个模块中有一些不同的构建块 a 是 b c d 的父目录 其中 b c d 是子目录 源文件分布在b c b中 我需要向 GDB 指定所有源文件都位于 a 父目录 中
  • 我应该使用 PhoneGap 而不是增加 Android SDK 吗?

    虽然我对 Java 很熟悉 但我在 Web 开发方面有更多的经验 我希望开始编写简单的 Android 游戏 我是否应该只使用 Javascript HTML 来编写所有内容 而忘记在 Java Android SDK 上进行升级 我想我的
  • AngularJS 单击时更改控制器中的部分内容

    我正在开发一个仪表板应用程序 其中同时显示一组模块 我想向这些模块添加多个 视图 例如 Github 模块的第一个视图是存储库列表 当您单击该模块中的存储库链接时 模块中的该视图将被替换为一个新屏幕 显示有关该存储库的所有详细信息 但是 我
  • ASP.Net MVC 3 登录和 Windows 身份验证

    我正在开发 ASP Net MVC 3 应用程序 并且有一个存储用户名及其密码的用户表 我创建了一个额外的 ADUsername 存储 Active Directory 的域 用户名 我正在尝试执行以下操作 从 Intranet 运行应用程
  • Cl.exe 返回错误代码 D8050

    我在使用 microsoft Visual Studio Ultimate 2013 全新安装 Windows 8 时出现以下错误 cl Command line error D8050 cannot execute C Program F
  • 如何通过 urlfetchapp 发送带有有效负载中的数组的 post 请求

    我需要模拟从 html 表单到页面的 post 请求 我需要知道如何在有效负载中正确发送数组 提前致谢 我有简单的 html 代码 目标页面将以这种方式收到提交 args data files form Link picturelink1
  • 重定向到文件后使用 cout 或 cerr 输出到控制台

    将 cout 或 cerr 重定向到文件非常容易 我可以用它来将第三方输出重定向到文件 但是 当我将第三方输出重定向到文件后 我自己如何使用 cout 输出到控制台 我是 RAII 的忠实粉丝 所以我曾经编写过这个小助手类 它将重定向流 直
  • 使用依赖网络的代码进行单元测试

    我正在努力更好地对我的代码进行单元测试 但现在我正在编写大量处理远程系统的代码 SNMP WMI 之类的 对于大多数类 我可以模拟对象来测试它们 但是如何处理真实系统的单元测试呢 例如 如果我的类出去并获取服务器的 Win32 Logica
  • Python Selenium 等待任何文本

    我有一个硒测试 需要等到填充任何文本而不是精确的文本字符串匹配 我了解到text to be present in element text to be present in element value可以用于这种类型的目的 但我可能需要像
  • iOS 中解析 JSON 与解析 XML

    设想 我正在开发一个解析器 用于在发出请求后从服务器发回的数据 数据的格式是 JSON 或 XML 问题 是否有理由选择其中一种格式而不是另一种 解析 json 和解析 xml 哪个更快 谢谢大家 当 JSON 成为首选时 通常是因为它要短
  • 向量化 for 循环以加速 R 中的程序

    我正在寻找一些简单的矢量化方法for loop在 R 中 我有以下数据框 其中包含句子和两本正面和负面单词的字典 Create data frame with sentences sent lt data frame words c jus
  • 如何使用Java Math Commons CurveFitter?

    如何使用 Math Commons CurveFitter 将函数拟合到一组数据 我被告知使用 CurveFitterLevenbergMarquardt优化器 and 参数单变量函数 但我不知道在 ParametricUnivariate
  • 无法在 asp.net core 2.0 中发布原始类型

    我将非常简单的 json 数据发布到 net Core 2 0 API 为什么我有这样的方法 public async Task
  • Golang 从哪里获取根 CA?

    crypto tls Config RootCAs states https golang org pkg crypto tls Config RootCAs defines the set of root certificate auth
  • 确定列上使用的最大小数位数

    在 MS SQL 中 我需要一种方法来确定某个十进制列的行所使用的最大比例 例如 Col1 Decimal 19 8 的小数位数为 8 但我需要知道是否实际使用了所有 8 个 或者是否仅使用了 5 6 或 7 样本数据 123 123450
  • 是什么导致以下程序中的分段错误[重复]

    这个问题在这里已经有答案了 如果我将行的值保留为 100000 则程序可以正常工作 但是如果我将行数 100 万设置为 1000000 则程序会出现分段错误 是什么原因 我在 Linux 2 6x RHEL 内核上运行 include
  • 快速比较 DateComponents

    Swift 中有没有方便的方式来表示 例如 15 个月大于 1 年 1 周小于 10 天 我感到DateComponents最能代表我的需求 所以我需要类似的东西 DateComponents year 1 gt DateComponent
  • 无法将 colorFilter 应用于文本选择手柄

    我正在尝试将材质文本选择句柄引入我的应用程序 我从 SDK 中获取了中 右 左手柄 位图 和文本光标 9 块 的可绘制对象 并设置