在 Marshmallow 上不会调用 Spannable String 的绘制方法

2023-12-21

我的应用程序中有一个日历。日历是一个带有每个日期按钮的 GridView。我尝试用下面的课程给它们上色

public class CircleSpan extends ReplacementSpan {

private final float mPadding;
private final int mCircleColor;
private final int mTextColor;

public CircleSpan(Context context) {
    super();
    TypedArray ta = context.getTheme().obtainStyledAttributes(new int[]{
            R.color.current_day,
            android.R.attr.textColorPrimaryInverse
    });
    mCircleColor = ta.getColor(0, ContextCompat.getColor(context, R.color.current_day));
    //noinspection ResourceType
    mTextColor = ta.getColor(1, 0);
    ta.recycle();
    mPadding = context.getResources().getDimension(R.dimen.padding_circle);
}

@Override
public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
    Log.d("CircleSpan", "getSize");
    return Math.round(paint.measureText(text, start, end) + mPadding * 2); // left + right
}

@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
    if (TextUtils.isEmpty(text)) {
        Log.d("CircleSpan", "empty draw");
        return;
    }
    float textSize = paint.measureText(text, start, end);
    paint.setColor(mCircleColor);
    canvas.drawCircle(x + textSize / 2 + mPadding,
            (top + bottom) / 2, // center Y
            (text.length() == 1 ? textSize : textSize / 2) + mPadding,
            paint);
    paint.setColor(mTextColor);
    canvas.drawText(text, start, end, mPadding + x, y, paint);
    Log.d("CircleSpan", "draw");
}

}

我创建了该类并使用棒棒糖测试设备对其进行了测试,一切正常。之后,我将应用程序与 Marshmallow 一起放置在我的设备上。日历内应具有颜色的条目不再可见。我发现我的 CircleSpan 类中的绘制方法甚至没有被调用。

通过一点“黑客”,我能够让它工作,但我对这个解决方案真的不满意。它由一个在屏幕末端不可见的 TextView 组成,该 TextView 也使用 CircleSpan 进行着色。区别在于文本的扩展,并且只为除扩展之外的所有内容着色:

                // Absolutly hacked
        SpannableString spannable1 = new SpannableString(theday + " ");
        spannable1.setSpan(new CircleSpan(gridcell.getContext(), ColorType.NONE),
                0, theday.length() - 1,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        mHack.setText(spannable1, TextView.BufferType.SPANNABLE);

只要“黑客”位于应用程序内部,其他所有内容都会像我编码的那样着色。但我真的不知道为什么。我在 Android 文档中阅读了有关 ReplacementSpan 的内容:ReplacementSpan 获取大小 https://developer.android.com/reference/android/text/style/ReplacementSpan.html#getSize(android.graphics.Paint,%20java.lang.CharSequence,%20int,%20int,%20android.graphics.Paint.FontMetricsInt)

但线索

返回跨度的宽度。扩展类可以通过更新 Paint.FontMetricsInt 的属性来设置跨度的高度。如果span覆盖整个文本,并且未设置高度,则不会为span调用draw(Canvas, CharSequence, int, int, float, int, int, int, Paint)。

对我没有帮助。有谁知道如何在没有“黑客”的情况下用我的班级为我的日历条目着色?为什么问题只出现在 Marshmallow 设备上?我不确定 Nougat 以及 Lollipop 以下设备上发生的情况。

我希望每个人都能理解我蹩脚的英语。提前致谢!


None

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

在 Marshmallow 上不会调用 Spannable String 的绘制方法 的相关文章

  • 在应用程序简历中隐藏软键盘

    我有一个 Android 应用程序 使用 Xamarin 用 C 编写 我已将应用程序简化为包含 TextView 和用于横幅广告的 Google admod AdView 的 LinearLayout 我不希望软键盘出现在应用程序中 这不
  • Android 通知进度条冻结

    这是我正在使用的代码 http pastebin com 3bMCKURu http pastebin com 3bMCKURu 问题是 一段时间后 文件变得更重 通知栏下拉速度变慢 最后它就冻结了 你的通知太频繁了 这就是它冻结的原因 让
  • getItem 与 getItemAtPosition

    有两种方法可以获取列表视图中的选定项目 list getAdapter getItem position list getItemAtPosition position 我的问题是 哪一种是首选的做法 我见过人们同时使用这两种方法 您可以使
  • 与 Admob 广告单元 ID 混淆

    我跟着tutorial https developers google com admob android quick start在我的应用程序中创建广告横幅 到目前为止 这有效 我可以看到测试广告 但是 本教程指示我在两个不同的位置使用两
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • 在自定义对象中创建时粘性服务不会重新启动

    我有一个具有绑定服务的单例对象 我希望它重新启动 当我从启动器启动应用程序时 单例对象将初始化并绑定到这个现有的服务实例 以下是在单例中创建和绑定服务的代码 public class MyState private static MySta
  • 如何从 SQLite 获取记录总数

    我正在尝试从 Sqlite DB 获取行的总数 以下是我想要做的代码片段 我不知道我在这里做错了什么 public static int getTotalCount Context context Cursor c null try c g
  • (Ionic 2)尝试回退到 Cordova-lib 执行时发生错误:TypeError:无法读取未定义的属性“then”

    Edit 使用 ionic 2 时会发生这种情况 我知道它还不稳定 但我认为可能有一些解决方案 因为其他人似乎没有遇到这个问题 Edit end 由于某种原因 我在尝试使用 ionic build android 和 ionic build
  • 在意图过滤器中使用多个操作时的默认值

    尝试理解 Android 中的意图和操作并查看文档 http developer android com guide topics intents intents filters html 但我一直看到的一件事是定义了多个操作的意图过滤器
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • 带有自定义阵列适配器的微调器不允许选择项目

    我使用自定义阵列适配器作为微调器 但是 当在下拉列表中选择一个项目时 下拉列表保留在那里 并且微调器不会更新 这是错误行为 与使用带有字符串的通用数组适配器相比 这是自定义类 我错过了什么吗 谢谢 public class Calendar
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 如何在不更改手机语言的情况下更改Android应用程序语言?

    我希望用户在应用程序内选择一种语言 选择语言后 我希望字符串使用特定语言 如果我更改手机语言 那么我的应用程序将以设置的语言运行 我无法找到任何在不更改手机语言的情况下设置语言的方法 此外 一旦设置了语言 更改就应该反映出来 有人可以建议一
  • Android 设备上的静默安装

    我已经接受了一段时间了 在 Android 上静默安装应用程序是不可能的 也就是说 让程序安装捆绑为 APK 的应用程序 而不提供标准操作系统安装提示并完成应用程序安装程序活动 但现在我已经拿到了 Appbrain 快速网络安装程序的副本
  • 在 Android 上按下电源按钮时,如何防止先调用 onDestroy() 再调用 onCreate()

    我正在记录每个 onCreate 和 onDestroy 调用 我发现 一旦我单击 Android 上的电源按钮 以及模拟器上的电源按钮 我的活动中就会拨打电话 gt onDestroy gt onCreate 这会杀死我的游戏 然后立即从
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • Android - 将 ImageView 保存到具有全分辨率图像的文件

    我将图像放入 ImageView 中 并实现了多点触控来调整 ImageView 中的图像大小和移动图像 现在我需要将调整大小的图像保存到图像文件中 我已经尝试过 getDrawingCache 但该图像具有 ImageView 的大小 我
  • 使用 Espresso 检查 EditText 的字体大小、高度和宽度

    如何使用 Espresso 检查 EditText 的字体大小 高度和宽度 目前要分割我使用的文本 onView withId R id editText1 perform clearText typeText Amr 并阅读文本 onVi
  • 如何删除因 Google Fitness API 7.5.0 添加的权限

    将我的 play services fitness api 从 7 0 0 更新到 7 5 0 后 我注意到当我将新版本上传到 PlayStore 时 它 告诉我正在添加一个新权限和 2 个新功能 我没有这样做 有没有搞错 在做了一些研究来
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项

随机推荐

  • 判断一个数是完美数还是素数

    问题是 编写一个函数来判断一个数是素数还是完全数 到目前为止 我已经首先完成了完美的部分 这就是我所拥有的 include
  • Excel 如何比较 2 列范围

    我正在尝试比较 Excel 中的两组列范围 我知道标准比较公式 Eg A1 E1 我正在寻找的是以下公式的替代品 AND A1 E1 B1 F1 C1 G1 由于列数很大 我在想是否可以使用单元格范围 比 Chronocidal慢一点 只是
  • 星际争霸、帝国时代等即时战略游戏的协议是什么样的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对这些类型的游戏的协议 和游戏循环 如何工作感兴趣 任何指示或见解表示赞赏 我猜想主循环会有一个世界状态 每秒会前进几个 滴答声 但
  • 如何阻止 gke-metadata-server 继续生成此日志?

    我创建了一个部署 意味着在启用工作负载身份的情况下将消息从 pubsub 插入到 bigquery 云日志不断向我发送此类日志 insertId test jsonPayload message rpc id test computeMet
  • 是否有关于 Dagger 在注入依赖项时何时回退到反射的文档?

    我的团队在我们的 Android 应用程序中采用了 Dagger 进行依赖注入 我必须说到目前为止我们很喜欢它 然而 我们希望确保我们有效地使用它 我想知道是否有人可以解释或者是否有任何文档解释 Dagger 回退到反射来注入依赖项的情况
  • 如何使用 EmberJS 在路由中加载 ownTo/hasMany 关系

    在我的 Ember JS 应用程序中 我显示了一个约会列表 在约会控制器的操作中 我需要获取约会所有者 但所有者始终返回 未定义 我的文件 模型 appointment js import DS from ember data export
  • R CMD 检查因“未定义的导出”而失败

    我正在尝试创建 R 包 但不断收到错误 Error in namespaceExport ns exports undefined exports MCLE defineFunctions naiveMLE 跑步时R CMD check在我
  • JPA2 Criteria API 运行时从 varchar(25) 转换为十进制

    因此 我已经看到类似主题上堆栈溢出的所有线程 但我没有找到解决我的问题的方法 我正在尝试创建一个 Criteria 查询 并得到以下 SQL 第一个 SQL 简化版 SELECT latitude FROM stations WHERE A
  • Javascript momentjs 将 UTC 从字符串转换为日期对象

    各位 在处理 moment js 文档时遇到困难 record lastModified moment utc format returns 2014 11 11T21 29 05 00 00 太棒了 它是 UTC 当我将其存储在 Mong
  • 在 Windows 上使用 C 将数据流式传输到声卡 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 作为大学项目的一部分 我必须进行一些信号处理 并希望使用 PC 声卡输出结果 该软件必须用 C 语言编写
  • 如何正确使用批处理 Tensorflow 数据集?

    我是 Tensorflow 和深度学习的新手 并且在 Dataset 类上遇到了困难 我尝试了很多方法 但找不到好的解决方案 我正在尝试什么 我有大量图像 500k 来训练我的 DNN 这是一个去噪自动编码器 所以我每个图像都有一对 我正在
  • ActionBar 菜单项中的 orderInCategory 是什么以及为什么它用于..?

    我正在处理操作菜单项及其溢出项 这是我的main menu xml menu menu
  • 如何让 Maven 构建更快?

    我有一个多模块java项目 Maven 大约需要 40 秒来构建它 我也尝试过使用多线程构建 Maven 方法是指定 T 和 C 参数来表示不使用任何线程和核心 但我还没有看到我的构建的墙时间有任何显着的改进 我正在使用 maven 3 2
  • 如何防止每次运行整个笔记本时运行“pip install ...”?

    我运行的大多数 python 笔记本在初始运行时往往需要一些设置 使用 pip install 每次运行笔记本时都执行设置代码效率很低 因此我宁愿避免这种情况 另外 我不想将设置代码移动到不同的笔记本 因为通常它只是几行代码 我的解决方案是
  • 在 Python 中将 ASCII 代码列表转换为字符串(字节数组)

    我有一个整数 ASCII 值列表 需要将其转换为字符串 二进制 以用作加密操作的密钥 我正在用python重新实现java加密代码 这是可行的 假设密钥是 8 字节 key struct pack BBBBBBBB 17 24 121 1
  • 如何在Linux上列出非空子目录?

    我有一个包含多个子目录的目录 我只想列出那些至少包含一个文件的子目录 我怎样才能做到这一点 find mindepth 1 maxdepth 1 not empty type d 将为您提供所有非空目录 如果您想排除仅包含其他目录 但不包含
  • 抽象类返回

    抱歉 如果这是一件小事 我创建了一个带有一些子类的抽象类 控制器类创建请求子类类型的抽象类类型的对象 并返回实现的抽象类 子类具有特定的属性 我无法访问返回对象的这些属性 因为这是抽象类默认类型 所以我尝试进行转换 但这会出现错误 item
  • 在 Heroku 上运行 Rails 单元测试

    我已经将一个应用程序部署到 Heroku 一切正常 问题是我无法远程运行单元测试 我试过了 heroku rake test units and heroku rake db test prepare 但对于两者 我都得到了大量的堆栈跟踪
  • 重命名远程分支

    我创建了一个本地分支 X 在某个时候我将其推送到远程服务器 来源 git push origin X 我意识到将分支命名为 X 并希望将其命名为 Y 是一个坏主意 问题是我已经将分支推送到存储库 从服务器中删除它并以这样的新名称推送它是否安
  • 在 Marshmallow 上不会调用 Spannable String 的绘制方法

    我的应用程序中有一个日历 日历是一个带有每个日期按钮的 GridView 我尝试用下面的课程给它们上色 public class CircleSpan extends ReplacementSpan private final float