使用退格键删除整个 Spannable

2024-03-01

我有一个聊天应用程序,可以在文本中添加表情符号。

我有一个问题EditText场地。表情符号图像显示出来,但如果我按普通键盘上的退格按钮,我要更改为表情符号图片的文本就会显示出来,我必须删除几个字符,直到图片消失。我在用Spannable去做这个。

我希望如果用户按一次退格键,整个笑脸就会消失。

这是我正在使用的代码:

// This is in the keyclicked listener
{
    ...
    smilie = "(angel)";
    break;
    ...
    int cursorPosition = content.getSelectionStart();
    content.getText().insert(cursorPosition, getSmiledText(this, smilie));
    content.getText().insert(cursorPosition + smilie.length(), " ");
}

public static boolean addSmiles(Context context, Spannable spannable) {
    boolean hasChanges = false;
    for (Entry<Pattern, Integer> entry : smilies.entrySet()) {
        Matcher matcher = entry.getKey().matcher(spannable);
        while (matcher.find()) {
            boolean set = true;
            for (ImageSpan span : spannable.getSpans(matcher.start(),
                    matcher.end(), ImageSpan.class))
                if (spannable.getSpanStart(span) >= matcher.start()
                        && spannable.getSpanEnd(span) <= matcher.end())
                    spannable.removeSpan(span);
                else {
                    set = false;
                    break;
                }
            if (set) {
                hasChanges = true;
                spannable.setSpan(new ImageSpan(context, entry.getValue()),
                        matcher.start(), matcher.end(),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    }
    return hasChanges;
}

public static Spannable getSmiledText(Context context, CharSequence text) {
    Spannable spannable = spannableFactory.newSpannable(text);
    addSmiles(context, spannable);
    return spannable;
}

因此,您不能强迫键盘执行此操作 - 键盘通常不会查看此类信息。您可以做的是将 TextWatcher 放在编辑字段上并覆盖 afterTextChanged 以检测这种情况并删除所需的其他字符。这将是一个痛苦,但它是可行的。

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

使用退格键删除整个 Spannable 的相关文章

  • 如何清除所有WebView存储的信息?

    我有一个 Android 浏览器 我可以选择清除缓存 存储 cookie 等 代码如下所示 webView clearCache true webView clearFormData webView clearHistory webView
  • 如何对这个字符串进行子串化

    我想得到这个字符串的 4 个部分 String string 10 trillion 896 billion 45 million 56873 我需要的4个部分是 10万亿 8960亿 4500万 和 56873 我所做的是删除所有空格 然
  • 卸载后 Web 应用程序不显示“添加到主屏幕”

    这是我第一次创建网络应用程序 我设法解决了这个问题 所以我得到了实际的 chrome 提示 将其添加到主屏幕 然后我从手机上卸载了该网络应用程序 因为我想将其展示给我的同事 但是 屏幕上不再出现提示 问题 这是有意为之的行为还是我的应用程序
  • Android 30+ 中的视频捕获意图 - 只有所有者才能与待处理项目交互

    我正在尝试在我的应用程序上捕获视频 它可以在 android API 30 以下运行 但不能在 30 以上运行 似乎在 sdk 30 之后 android 不允许完全读取外部存储 作用域存储 我目前遇到这个错误 java lang Ille
  • android xamarin 中的 reCaptcha

    我想在 Xamarin android 应用程序中实现验证码 我抓住了这个在 Android 中集成 googles reCaptcha 验证 https www c sharpcorner com article how to integ
  • 计数物体和更好的填充孔的方法

    我是 OpenCV 新手 正在尝试计算物体的数量在图像中 我在使用 MATLAB 图像处理工具箱之前已经完成了此操作 并在 OpenCV Android 中也采用了相同的方法 第一步是将图像转换为灰度 然后对其进行阈值计算 然后计算斑点的数
  • Android Activity 生命周期函数基础知识

    我正在测试这段代码 它显示活动所处的状态 public class Activity101Activity extends Activity String tag Lifecycle Called when the activity is
  • Android SIP 来电使用带有广播接收器的服务

    大家好 其实我正在尝试创建一个应用程序 支持基于 SIP 通过互联网进行音频呼叫 这里使用本机 sip 我遇到了来电问题 我已经完成了服务的注册部分 但是在接听电话时我无法接听电话 请帮助我 Service file package exa
  • 在gradle插件中获取应用程序变体的包名称

    我正在构建一个 gradle 插件 为每个应用程序变体添加一个新任务 此新任务需要应用程序变体的包名称 这是我当前的代码 它停止使用最新版本的 android gradle 插件 private String getPackageName
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 原色(有时)变得透明

    我正在使用最新的 SDK 版本 API 21 和支持库 21 0 2 进行开发 并且在尝试实施新的材料设计指南时遇到了麻烦 材料设计说我需要有我的primary color and my accent color并将它们应用到我的应用程序上
  • 在 SQLite 中搜索时排除 HTML 标签和一些 UNICODE 字符

    更新 4 我已经成功运行了firstchar例如 但现在的问题是使用regex 即使包含头文件 它也无法识别regex操作员 有什么线索可以解决这个问题吗 更新 2 我已经编译了sqlite3我的项目中的库 我现在正在寻找任何人帮助我为我的
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何根据 gradle 风格设置变量

    我想传递一个变量test我为每种风格设置了不同的值作为 NDK 的定义 但出于某种原因 他总是忽略了最后味道的价值 这是 build gradle apply plugin com android library def test andr
  • 增加活动的屏幕亮度

    显然 Android 操作系统中至少有三种不同的技术可以改变屏幕亮度 其中两个在纸杯蛋糕之后不再起作用 而第三个被接受的技术显然有一个错误 我想在单视图活动开始时增加屏幕亮度 然后在活动结束时将亮度恢复为用户设置 没有按钮 没有第二个视图或
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 将两个文本视图并排放置在布局中

    我有两个文本视图 需要在布局中并排放置 并且必须遵守两条规则 Textview2 始终需要完整显示 如果布局中没有足够的空间 则必须裁剪 Textview1 例子 文本视图1 文本视图2 Teeeeeeeeeeeeeeeeeextview1
  • android sdk 的位置尚未在 Windows 操作系统的首选项中设置

    在 Eclipse 上 我转到 windows gt Android SDK 和 AVD Manager 然后弹出此消息 Android sdk 的位置尚未在首选项中设置 进入首选项 在侧边栏找到 Android 然后会出现一个 SDK 位
  • Crashlytics 出现 Android Studio 构建错误

    我正在尝试将 CrashLytics 与 Android Studio 和 gradle 一起使用 但出现一个令人困惑的错误 java lang NoSuchMethodError 我的 build gradle 是 buildscript

随机推荐

  • 如何检查 GTK+3.0 中小部件的类型?

    I saw this https stackoverflow com questions 60112777 find type of gtk widgets帖子 但它是针对 Python 的 所以这对我没有太大帮助 我正在使用 C 进行编程
  • 如何避免 gen_l10n/app_localizations.dart 的 lint 问题“依赖于引用的包”[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 在我的 Flutter 应用程序上 我遇到了 lint 规则的问题 依赖于引用的包 https dart lang gi
  • Intel TBB 可以在 AMD 处理器上运行吗? [复制]

    这个问题在这里已经有答案了 可能的重复 AMD多核编程 https stackoverflow com questions 1623975 amd multi core programming Is 英特尔TBB http threadin
  • C#:从锁定块调用事件

    我通常听说在调用事件侦听器之前解锁所有锁以避免死锁是一个好主意 然而 自从lock 块可以由 C 中的同一线程重入 是否可以从锁定块调用事件 或者我是否需要复制相关状态数据并在锁定块外部调用事件 如果没有 请举例说明何时从某个对象内调用事件
  • “MutationObserver”上的“观察”:参数 1 不是“Node”类型

    我正在创建一个 Chrome 扩展程序 并尝试在 gMail 撰写框的 发送 按钮旁边包含一个小文本 我正在使用 MutationObserver 来了解撰写框窗口何时出现 我通过观察带有类的元素来做到这一点no因为撰写框元素是作为该元素的
  • 在函数参数之前使用 & 的目的是什么?

    我看到一些函数声明是这样的 function boo var 什么是 性格呢 这是通过引用传递 函数内的变量 指向 与调用上下文中的变量相同的数据 function foo bar bar 1 x 0 foo x echo x 1
  • Codeigniter REST CSV 导入到 mysql

    我想使用 API 在我的控制器上发布 csv 文件 我正在使用 phil sturgeon 的 Codeigniter REST 库 如何在客户端实现将 CSV 导入到我的 REST 服务器 我只是想问一下 因为我找不到任何有关它的文档 这
  • var FOO = FOO || 如何实现Javascript 中的 {} 习惯用法?

    从这个问题来看 var FOO FOO 将变量或空对象分配给该变量 在 Javascript 中意味着什么 https stackoverflow com questions 6439579 what does var foo foo as
  • 如何用单引号插入文本sql server 2005

    我想插入带单引号的文本 例如 john 到 sql server 2005 数据库中的表 正如 Kirtan 指出的那样 使用附加单引号来转义单引号如果您尝试通过 sp executesql 执行动态 sql 这首先不是一个好主意 那么下面
  • 如何从 UITableView 中获取选定的行?

    因此 我编写了这段代码 在我想要选择的行旁边打上复选标记 因为我想要多个选定的行 UITableViewCell cell tableView cellForRowAtIndexPath path if cell accessoryType
  • 为什么 const 左值引用可以引用可变右值引用?

    在 C 11 中 可以使用可变右值引用来初始化 const 左值引用 然后 右值引用的值可以发生变化 产生 const 左值引用的可见突变 这是一个例子 int rval 3 const int lval rval cout lt lt l
  • DbSet 在 EF7 中没有 Find 方法

    我正在尝试创建一个通用存储库来访问我的数据库 在 EF6 中 我能够这样做以获得特定的实体 protected IDbSet
  • R:合并具有相同ID的行[重复]

    这个问题在这里已经有答案了 Edit 我将 Var4 更改为字符串值 因为我的问题对我的数据不够精确 因此由于类型无效 答案失败 对此感到抱歉 这是我的第一个问题 我希望有人可以帮助我 我有以下数据集 ID Date N Date Var1
  • 在列表中查找一个值[重复]

    这个问题在这里已经有答案了 我使用以下命令来检查是否item is in my list if item in my list print Desired item is in list Is if item in my list 在列表中
  • 与 Vuex-ORM 的两种方式数据绑定

    有谁知道使用时在表单中实现双向数据绑定的库或已经描述的模式Vuex ORM https vuex orm github io vuex orm 我找到了几个可以帮助解决 Vuex 问题的库 但还没有专门针对 Vuex ORM 的库 vuex
  • 如何在 Java 中使用 servlet 过滤器来更改传入的 servlet 请求 url?

    如何使用 servlet 过滤器更改传入的 servlet 请求 url http nm java appspot com Check License Dir My App Dir ABC My Obj 123 to http nm jav
  • 使用spring-amqp和rabbitmq实现带退避的非阻塞重试

    我正在寻找一种使用 spring amqp 和 Rabbit MQ 的退避策略来实现重试的好方法 但要求是侦听器不应被阻止 因此可以自由地处理其他消息 我在这里看到了类似的问题 但它不包括 后退 的解决方案 RabbitMQ 和 Sprin
  • Kohana 3 分页

    我真的不知道 Kohana 3 中的分页是如何工作的 Kohana 3 中是否有一个很好的分页示例 Get the total count of articles count this gt profil gt articles gt co
  • 如何检测窗口是否闪烁

    当需要吸引用户注意时 我使用 FlashWindowEx 来闪烁应用程序窗口 窗口标题和任务栏按钮持续闪烁 直到应用程序获得焦点 如何检查应用程序当前是否正在闪烁 即 自从指示其闪烁以来尚未获得焦点 这里有两种可能的解决方案 一种使用 WH
  • 使用退格键删除整个 Spannable

    我有一个聊天应用程序 可以在文本中添加表情符号 我有一个问题EditText场地 表情符号图像显示出来 但如果我按普通键盘上的退格按钮 我要更改为表情符号图片的文本就会显示出来 我必须删除几个字符 直到图片消失 我在用Spannable去做