防止Android的TextView破坏链接

2023-12-23

这个问题可能与this one https://stackoverflow.com/questions/21094349/prevent-line-break-in-textview,但由于它的答案都没有真正解决问题,所以我会再问一次。

我的应用程序有一个 TextView,偶尔会显示很长的 URL。出于美观原因(并且由于 URL 不包含空格),理想的行为是在跳到下一行之前完全填充每一行,如下所示:

|http://www.domain.com/som|
|ething/otherthing/foobar/|
|helloworld               |

相反,URL 在栏附近被破坏,就好像它们是空格一样。

|http://www.domain.com/   |
|something/otherthing/    |
|foobar/helloworld        |

我尝试扩展 TextView 类并添加修改版本手动中断方法 (在这里找到 https://stackoverflow.com/questions/14373157/dont-wrap-text-in-android-textview-at-period-in-abbreviation)欺骗 TextView 并执行我需要的操作,调用它尺寸改变时(被覆盖)。它工作得很好,除了 TextView 位于 ListView 内部这一事实之外。当此自定义 TextView 被滚动隐藏并返回时,其内容将返回到原始的破坏行为,因为视图被重新绘制而没有尺寸改变时被召唤。

我可以通过调用来解决这个问题手动中断 inside onDraw。这始终呈现预期的行为,但性能成本很高:因为onDraw每当 ListView 滚动并且手动中断方法并不完全是“轻量级”,即使在高端四核设备上,滚动也会变得令人无法接受的滞后。

下一步是爬行文本视图源代码 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/TextView.java,尝试找出它在何处以及如何分割文本,并希望覆盖它。这是一次彻底的失败。我(一个新手)花了一整天的时间毫无结果地查看我几乎无法理解的代码。

这让我来到这里。有人可以指出我应该覆盖什么的正确方向吗(假设这是可能的)?或者也许有更简单的方法来实现我想要的?

这是手动中断我提到的方法。由于使用获取宽度(),只有在测量视图后调用它才有效。

private CharSequence breakManually (CharSequence text) {
        int width = getWidth() - getPaddingLeft() - getPaddingRight();
        // Can't break with a width of 0.
        if (width == 0) return text;
        Editable editable = new SpannableStringBuilder(text);
        //creates an array with the width of each character
        float[] widths = new float[editable.length()];
        Paint p = getPaint();
        p.getTextWidths(editable.toString(), widths);
        float currentWidth = 0.0f;
        int position = 0;
        int insertCount = 0;
        int initialLength = editable.length();
        while (position < initialLength) {
            currentWidth += widths[position];
            char curChar = editable.charAt(position + insertCount);
            if (curChar == '\n') {
                currentWidth = 0.0f;
            } else if (currentWidth > width) {
                editable.insert(position + insertCount , "\n");
                insertCount++;
                currentWidth = widths[position];
            }
            position++;
        }
        return editable.toString();
    }

对于所有愿意阅读本文的人,感谢您抽出时间。


如果您不使用等宽字体,那么在某些情况下甚至无法很好地对齐它。由于 URL 中没有空格,因此类似 Justify 的对齐方式不太可能解决问题。我建议您对特定的 TextView 使用等宽字体。然后,决定每行固定的字符数,并用以下命令分隔要显示的字符串"\n"在这么多字符之后。

这并没有回答你的问题,但我想这是最顺利的方式。

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

防止Android的TextView破坏链接 的相关文章

随机推荐

  • JavaFX 没有 TouchEvents

    在我的 Windows Surface Go 2 平板电脑上 我无法检索任何 多点触控 触摸事件 我尝试了几个 Java FX 版本 即使使用 JavaFX 17 及更早版本 也不会生成 TouchEvents 事件 仅生成鼠标事件 是否需
  • 每10秒自我更新一次的小部件Handler.postDelayed问题

    我正在尝试使工作成为 Android 小部件中的自我更新功能 就像每 10 秒更改它的两个 TextView 一样简单 理想的解决方案是使其类似于精灵小部件 新闻和天气 到目前为止 它工作正常 它通过 Handler postDelayed
  • Pycharm 设置 Mysql 数据库驱动程序

    我正在尝试在 pycharm 中设置 mysql 数据库连接 我已经创建了架构并且它可以在 django 等中工作 我试图将数据源直接导入到 pycharm 但出现以下错误 Connection to Exception in thread
  • 为什么 smartcast 不能处理这种情况?

    我有一些与此结构类似的代码 private fun test Double val a Double 15 0 val b Double 20 0 return if a null b null 0 else if a null b nul
  • 我的主函数反汇编中所有这些奇怪的汇编指令是什么?

    所以我有这个主要功能 它会产生很多奇怪的指令 我使用的是 Visual Studio 2019 并且处于调试模式 因此禁用了优化 这些指令是做什么的 int main 00D340E0 push ebp 00D340E1 mov ebp e
  • 使用自定义 Comparer 的 OrderBy 的 Linq 语法

    对于带有自定义排序比较器的任何给定 Linq 表达式 有两种格式 Format 1 var query source Select x gt new x someProperty x otherProperty OrderBy x gt x
  • jQuery fadeIn '慢' 立即出现

    我试图做到这一点 以便当您单击链接时 它会删除一个 div 带有一些段落和文本 并插入另一个 div 带有一些段落和一些文本 我正在使用 jQuery 来淡入和淡出它们 当您单击链接时 原始 div 会淡出 然后我有一个 switch ca
  • 如何从 GooglePicker 上选定的文件中获取 blob

    我正在使用 GooglePicker 和 React 我得到的结果是一个对象数组 id 1 m serviceId docs mimeType image jpeg name name jpg description type photo
  • 带有纹理背景的 CSS 之字形边框

    我一直在研究带有锯齿形边框的标题 一种方法是使用图像来制作之字形效果 1 有没有办法在CSS中创建一个实用的跨浏览器之字形边框而不使用图像 我还尝试在该标题上放置一个延伸到之字形的纹理背景 但是 标题的垂直尺寸可能会改变 并且我无法将标题实
  • 单击按钮时滚动视图向上和向下滚动[重复]

    这个问题在这里已经有答案了 可能的重复 以编程方式滚动 UIScrollView https stackoverflow com questions 2234875 programmatically scroll a uiscrollvie
  • Mac Swampy(Python学习模块)安装

    我想教我的孩子们编程 并且正在使用 Downey 的 Think Python 这本书很棒 除了他安装 Swampy 一个类似海龟的学习模块时 我花了几个小时试图弄清楚 现在我需要帮助 任何人都可以提供有关如何安装 Swampy 的清晰 分
  • asp.net mvc 并检查用户是否登录

    我是 ASP NET MVC 新手 我需要检查用户是否在我的应用程序中登录 因此我将以下代码放在我的 global asax 中 void Application PreRequestHandlerExecute object sender
  • 无效写入——Valgrind

    您好 我在我的 c 程序中遇到了 munmap chunk invalid point 错误 主要问题是 我什至不确定指针可能变得无效的所有方式是什么 我已经检查了我的代码中是否有没有足够空间调用的字符串 但没有发现任何看起来会超出范围的情
  • GDB:在头文件中的模板类函数中设置断点时出错

    我使用了两个不同版本的 GDB 都在以下代码中出现问题 删减代码MyFile h template
  • PHP Markdown 中如何将单个换行符视为真正的换行符?

    我正在读书http github github com github flavored markdown http github github com github flavored markdown 我想在 PHP Markdown 中实
  • C 中全局变量总是初始化为零吗? [复制]

    这个问题在这里已经有答案了 include
  • Liquibase - 常用列?

    在我的数据库中 每个表都有 4 个公共列 DATE CREATED USER CREATED DATE MODIFIED USER MODIFIED 并且我想将此规则隐式传播到所有新表 是否可以在无需手动生成 liquibase 脚本的情况
  • 上传图像并使用 Flask 将其显示为响应

    我是前端开发的初学者 必须在 Flask 中为项目制作一个小型 Web 应用程序 我编写了一个 Flask 应用程序 可让您使用 HTML 表单上传图像 然后在单击 上传 时将图像显示给用户 我需要对此进行修改 以便每次用户上传图像时图像不
  • Gatsby:基本路径和路径前缀有什么区别?

    我不明白之间的区别basepath and path prefix in Gatsby 以及何时使用每个功能 基本路径 https www gatsbyjs org tutorial part 7 https www gatsbyjs or
  • 防止Android的TextView破坏链接

    这个问题可能与this one https stackoverflow com questions 21094349 prevent line break in textview 但由于它的答案都没有真正解决问题 所以我会再问一次 我的应用