使用退格键删除整个 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 的相关文章

随机推荐

  • 如何检查 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去做