从 edittext 中选定的文本中删除样式

2023-11-27

我的应用程序应该允许用户在 Edittext 中设置输入或选定文本的样式。其中一些样式有下划线、删除线、粗体和斜体。它们很容易添加,但我不知道如何将它们移除 and 我如何确定该样式是否已添加到选定的文本。 添加样式的代码:

Spannable str = myEditText.getText();
    if (!SpannableUtils.isEmpty(str)) {
        str.setSpan(new StrikethroughSpan(), startSelection, endSelection,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

我尝试使用removeSpan,但没有成功。 还尝试使用

        str.setSpan(new StyleSpan(android.graphics.Typeface.DEFAULT),
                startSelection, endSelection,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

但它提出了错误:构造函数 StyleSpan(Typeface) 未定义。


我认为这堂课可以解决你的问题。

public class StyleSpanRemover {

    public void RemoveOne(Spannable spannable,
                          int startSelection, int endSelection, Class<?> style){

        ArrayList<SpanParts> spansParts = getSpanParts(spannable, startSelection, endSelection);
        removeOneSpan(spannable, startSelection, endSelection, style);
        restoreSpans(spannable, spansParts);
    }

    public void RemoveStyle(Spannable spannable,
              int startSelection, int endSelection, int styleToRemove){

        ArrayList<SpanParts> spansParts = getSpanParts(spannable, startSelection, endSelection);
        removeStyleSpan(spannable, startSelection, endSelection, styleToRemove);
        restoreSpans(spannable, spansParts);
    }

    public void RemoveAll(Spannable spannable, int startSelection, int endSelection){

        ArrayList<SpanParts> spansParts = getSpanParts(spannable, startSelection, endSelection);
        removeAllSpans(spannable, startSelection, endSelection);
        restoreSpans(spannable, spansParts);
    }

    protected void restoreSpans(Spannable spannable, ArrayList<SpanParts> spansParts){

        for (SpanParts spanParts : spansParts) {
            if(spanParts.part1.canAplly())
                spannable.setSpan(spanParts.part1.span, spanParts.part1.start,
                                  spanParts.part1.end,spanParts.span_flag);
            if(spanParts.part2.canAplly())
                spannable.setSpan(spanParts.part2.span, spanParts.part2.start,
                                  spanParts.part2.end, spanParts.span_flag);
        }
    }

    protected void removeAllSpans(Spannable spannable,int startSelection, int endSelection) {

        Object spansToRemove[] = spannable.getSpans(startSelection, endSelection, Object.class);
        for(Object span: spansToRemove){
            if(span instanceof CharacterStyle)
                spannable.removeSpan(span);
        }
    }

    protected void removeOneSpan(Spannable spannable,int startSelection, int endSelection,
                           Class<?> style) {

        CharacterStyle spansToRemove[] = spannable.getSpans(startSelection, endSelection, CharacterStyle.class);
        for(CharacterStyle span: spansToRemove){
            if(span.getUnderlying().getClass() == style )
                spannable.removeSpan(span);
        }
    }

    protected void removeStyleSpan(Spannable spannable, int startSelection,
        int endSelection, int styleToRemove) {

        MetricAffectingSpan spans[] = spannable.getSpans(startSelection, endSelection, MetricAffectingSpan.class);
        for(MetricAffectingSpan span: spans){
            int stylesApplied = 0;  
            int stylesToApply;
            int spanStart;
            int spanEnd;
            int spanFlag;
            Object spanUnd = span.getUnderlying();
            if(spanUnd instanceof StyleSpan){
                spanFlag = spannable.getSpanFlags(spanUnd);
                stylesApplied = ((StyleSpan) spanUnd).getStyle();
                stylesToApply = stylesApplied & ~styleToRemove;

                spanStart = spannable.getSpanStart(span);
                spanEnd = spannable.getSpanEnd(span);
                if(spanEnd >= 0 && spanStart >= 0){
                    spannable.removeSpan(span);
                    spannable.setSpan(new StyleSpan(stylesToApply), spanStart, spanEnd,spanFlag);
                }
            }
        }
    }

    protected ArrayList<SpanParts> getSpanParts(Spannable spannable,
                                              int startSelection,int endSelection){

        ArrayList<SpanParts> spansParts = new ArrayList<SpanParts>();
        Object spans[] = spannable.getSpans(startSelection, endSelection, Object.class);
        for(Object span: spans){
            if(span instanceof CharacterStyle){
                SpanParts spanParts = new SpanParts();
                int spanStart = spannable.getSpanStart(span);
                int spanEnd = spannable.getSpanEnd(span);
                if(spanStart == startSelection && spanEnd == endSelection) continue;
                spanParts.span_flag = spannable.getSpanFlags(span);
                spanParts.part1.span = CharacterStyle.wrap((CharacterStyle) span);
                spanParts.part1.start = spanStart;
                spanParts.part1.end = startSelection;
                spanParts.part2.span = CharacterStyle.wrap((CharacterStyle) span);
                spanParts.part2.start = endSelection;
                spanParts.part2.end = spanEnd;
                spansParts.add(spanParts);
            }
        }
        return spansParts;
    }

    private class SpanParts{
        int span_flag;
        Part part1;
        Part part2;
        SpanParts() {
            part1 = new Part();
            part2 = new Part();
        }
    }
    private class Part{
        CharacterStyle span;
        int start;
        int end;
        boolean canAplly() {
            return start < end;
        }
    }
}

如何使用:

int startSelection=editText.getSelectionStart();
int endSelection=editText.getSelectionEnd();
Spannable spannable = editText.getText();

StyleSpanRemover spanRemover = new StyleSpanRemover();
// to remove all styles
spanRemover.RemoveAll(spannable,startSelection,endSelection);
//to remove only StrikethroughSpan style use:
spanRemover.RemoveOne(spannable,startSelection,endSelection,StrikethroughSpan.class);
//to remove one StyleSpan use:
spanRemover.RemoveStyle(spannable,startSelection,endSelection,Typeface.BOLD)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 edittext 中选定的文本中删除样式 的相关文章

  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • Android 中多个蓝牙连接的自定义 UUID

    我有一个 Android 设备作为服务器连接到多个蓝牙 Android 客户端 我了解 UUID 的概念以及它的独特之处 我的问题是 我可以为连接到我的服务器的所有客户端使用相同的 UUID 吗 如果没有 我如何以编程方式为我的客户端生成
  • 按下按钮时应用不同的样式

    有没有办法在按下按钮时将样式应用于按钮 如果我有一种风格样式 xml
  • fetchUuidsWithSdp 的奇怪 UUID 逆转

    我有一个在树莓派上运行的 python 蓝牙服务器 使用 PyBluez 我在服务器中使用的uuid是 8f86d132 4ab8 4c15 b8df 0b70cf10ea56 我正在打电话device fetchUuidsWithSdp
  • 如何在 Linux 内核中定义并触发我自己的新软中断?

    我想在 Linux 内核中创建自己的软中断 这是正确的方法吗 In the init我想触发该模块的softirq我将添加一个调用 394 void open softirq int nr void action struct softir
  • Recyclerview 动态部分不使用任何第三个库

    我想将标头添加到 recyclerview 我正在尝试使用来实现它 Override public int getItemViewType int position depends on your problem if position 0
  • Android应用程序组件销毁和重新创建的详细信息

    有人可以向我提供一些具体的 值得信赖的 最好是简洁的 信息 内容如下 系统销毁和 如果适用 重新创建组件的顺序 片段 活动 活动的线程 异步任务 计时器 静态数据 类何时卸载 其他类中的线程 异步任务 定时器 主机 TabActivity
  • 在 Cordova 应用程序中获取额外功能

    我们有两个 Android 应用程序 一个使用本机 Java 实现 另一个使用 Ionic 编写 Ionic 应用程序启动我的应用程序 这是使用灯插件 https github com lampaa com lampa startapp 我
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • ExoPlayer2 - 如何使 HTTP 301 重定向工作?

    我开始使用 ExoPlayer 来传输一些音频 一切都很顺利 直到我遇到一个带有 301 永久移动 重定向的 URL ExoPlayer2 默认情况下不处理该问题 我已经看过这个线程 https github com google ExoP
  • 从 BroadcastReceiver 类调用活动方法

    我知道我可以做一个内部接收器类来调用接收器中的任何方法 但我的主要活动太大了 要做的事情也很多 因此 我需要一个扩展广播接收器的类 但它不是内部类 并且可以从我的主要活动中调用一种方法 我不知道是否可能 但我的活动是家庭活动和 single
  • okhttp 获取失败响应

    我已经在我的 android 客户端中实现了 okhttp 来进行网络调用 当我收到失败响应时 我会收到失败代码以及与该代码相关的文本作为消息 但我没有收到服务器发送给我的自定义失败响应 在我实施的代码中的失败响应中 我收到的消息只是 错误
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • 在 Samsung Galaxy S5 Android 5.0 上使用 MediaPlayer 加载音频流需要超过 10 秒

    由于更新至 Android 5 0 MediaPlayer 在 Samsung Galaxy S5 上无法正常工作 启动音频流后加载时间超过 10 秒 示例代码 MediaPlayer mPlayer new MediaPlayer Str
  • 如何检查 Android 中的同步设置

    我正在构建一个 Android 应用程序 我需要检查设备中注册的每个单独帐户的同步设置 我知道我可以通过 ContentResolver 类来做到这一点 但我遇到了一些问题 我已设法获取设备上所有帐户的列表 但我不知道在运行时从哪里获取特定
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • 在 Android 应用程序资源中使用 JSON 文件

    假设我的应用程序的原始资源文件夹中有一个包含 JSON 内容的文件 我如何将其读入应用程序 以便我可以解析 JSON See 开放原始资源 http developer android com reference android conte

随机推荐

  • 从 WebBrowser 控件中删除边框

    我有一个位于表单上的 WebBrowser 控件 该控件周围有一个令人恼火的 2px 内嵌边框 这导致我的内容在右侧和底部被裁剪了 4 px 而且我不知道如何摆脱它 控件本身没有任何 BorderStyle 属性 如何删除边框 请参阅屏幕截
  • 生成 PHP 接口

    有没有从现有类生成 php 接口的工具 如果有像 Netbeans 这样的自动 getter setter 创建工具 但对于接口来说 那就太好了 对于编程用途有InterfaceDistiller它允许您从现有类派生接口 如下所示 dist
  • 存储库模式逐步解释[关闭]

    Closed 这个问题是无关 目前不接受答案 有人可以向我解释 NET 中的存储库模式吗 逐步给出一个非常简单的示例或演示 我知道这是一个很常见的问题 但到目前为止我还没有找到满意的答案 作为总结 我将描述存储库模式的更广泛影响 它允许您的
  • C# 中释放 COM 对象

    我知道这个问题之前已经讨论过 但我找不到满意的答案 我有一个电子邮件文件 msg 我像下面一样打开它 然后调用 Display oApp new Microsoft Office Interop Outlook Application ma
  • 向 SQL Server Reporting Services 报告添加交替行颜色

    如何在 SQL Server Reporting Services 报表中对交替行进行着色 Edit 下面列出了很多很好的答案 来自quick and simple to 复杂而全面 唉 我只能选一个 转到表行的背景颜色属性并选择 表达式
  • 在 PySpark 中的值前面添加零

    我有一个数据框df val1 val2 val3 271 70 151 213 1 379 213 3 90 213 6 288 20 55 165 我想将此数据框转换为 val1 val2 val3 271 70 0151 213 01
  • “new”语句后的大括号有什么作用?

    我在看这个例子并想知道第一行的作用 private SiteStreamsListener listener new SiteStreamsListener 看起来您可以通过这种方式声明附加方法或重写方法 例如 我可以执行以下操作吗 Arr
  • 将导入的 scss 文件命名为 .scss 或 .css.scss

    我试图让 livereload 使用 Rails 3 2 我遇到了这个问题 其中提到不使用 css scss 命名导入的 sass 部分 Rails 将 livereload 与 Asset Pipeline 结合使用 导入的 SCSS 文
  • C++ Array vs Vector 性能测试说明 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 为了量化 C 类数组和 C 中向量的性能差异 我编写了这个小程序 https githu
  • Android xml 文件突然显示 java 代码。 [复制]

    这个问题在这里已经有答案了 我昨晚刚刚更改了 build gradle 文件调试部分中的基本 url 因为我的基本 url 已更改 一切都很好 直到今天我启动我的电脑和 android studio 并看到我所有的 xml 文件都有 jav
  • Firebase Cloud Firestore 触发器 context.auth 始终为 null [重复]

    这个问题在这里已经有答案了 我正在使用 Firebase 和 Cloud Firestore 构建一个群组应用程序 用户应该能够在其中创建群组并向其中添加成员 当用户创建组时 我希望云触发器在创建组后将该用户添加到组的成员列表中 触发器看起
  • Android 支持的语言/区域设置列表是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想知道如何为不同语言的文件夹命名 在哪里可以找到 Android 支持的语言列表 自 Android 5 1 起更新的列表 af Afrikaan
  • 无法更改 pty/N 上的终端大小(适用于 ttyN)

    我使用 next 来更改终端大小 rc ioctl fd TIOCSWINSZ ws 当我在 Linux 文本终端下运行这个 通过 Alt Ctrl F1 切换 时 结果是我期望看到的 我的整个输入和输出都在 ioctl 系统调用给出的范围
  • 如何将导航抽屉放在工具栏下方?

    我的导航抽屉位于工具栏上方 我还添加了一些 xml 代码 请帮助我 这是我的 Activity xml
  • 替换 BLOB 列中的文本

    在我们的一张桌子上有一个HUGEBLOB列 列名称是DYNAMIC DATA 其中包含 XML 数据 我需要做的是更新此 BLOB 中文本的特定部分 我尝试过这个查询 UPDATE ape1 item version SET DYNAMIC
  • 为什么 NetBeans 在 OS X 上运行我的程序,但不将其构建到 JAR 中?

    tl dr 我缺少什么依赖项 允许 NetBeans 在内部正常运行 OS X 集成程序 但无法清理并将其构建为 JAR 我正在尝试制作一个集成到 OS X 中的 Java 程序 但我希望也将其发布到 Windows 和 Linux 上 为
  • 如何从 Maven Reactor 构建中排除模块?

    我们有一个 Maven 2 项目 其中有很多模块 例子
  • 任务“:app:validateSigningRelease”执行失败。颤振误差

    我想发布我的应用程序 但遇到了这个问题 FAILURE Build failed with an exception What went wrong Execution failed for task app validateSigning
  • NSPredicate 未执行

    这很有趣 在我的应用程序中 我在数据库中创建了数千个条目 在另一个线程中 我使用 MagicalRecord 一切似乎都工作正常 从背景 前景 上下文的角度来看 当我在主线程中尝试获取 刚刚插入 的数据时 我发现了以下行为 NSArray
  • 从 edittext 中选定的文本中删除样式

    我的应用程序应该允许用户在 Edittext 中设置输入或选定文本的样式 其中一些样式有下划线 删除线 粗体和斜体 它们很容易添加 但我不知道如何将它们移除 and 我如何确定该样式是否已添加到选定的文本 添加样式的代码 Spannable