Android 中的断字
Posted
技术标签:
【中文标题】Android 中的断字【英文标题】:Hyphenation in Android 【发布时间】:2011-05-26 04:34:14 【问题描述】:作为国际化 android 应用程序的一部分,我遇到了在正确位置动态换行或断字的需要。
我的所有字符串都在 strings.xml 文件中进行了外部化,但我没有找到任何关于 的文档。
我希望能够建议类似于我在 LaTeX 中的连字符位置:
http://en.wikipedia.org/wiki/Hyphenation_algorithm
但我没有发现任何迹象表明这是否可行。我错过了框架中的任何内容吗?其他人在做什么?用没有明显位置的日文字符串打断句子?你只是在正确的位置添加空格吗?
我可以动态调整字体大小以适应某些布局,但对于跨越多行的较长消息不起作用。怎么办?
【问题讨论】:
android 是否尊重软连字符? (U+00AD) 我在韩语和其他语言中遇到过类似的问题,其中单个单词很大。对答案很感兴趣。一个问题可能是一开始就拆分这个词是否可以接受? @anon .. 是的,软连字符可能很有趣。我会检查一下。 软连字符在 Android 4.4 中有效,在 4.2 中无效。我想知道它是否适用于 4.3,这就是我希望在此页面上找到的内容。 SDK 17:\u00AD 和 \u200B 都不起作用。 SDK 19:\u200B 打断没有连字符的单词。 SDK 24 - \u00AD 正确断字,\u200B 打破没有连字符的单词。 【参考方案1】:它是来自 Android 6 Marshmellow 的新事物。
尝试将此添加到您的 TextView xml
android:hyphenationFrequency="none"
【讨论】:
在 Android Q up 中默认设置为“none”。以前不是这样的。 我要添加 setHyphenationFrequency(int) 连字符在 Android Q 中默认为“关闭”以提高性能,如果需要,您需要将其打开。 android-developers.googleblog.com/2019/07/…【参考方案2】:换行的管理可能很麻烦。最好的选择是使用 UTF 换行修饰符控制字符,因为 android 支持完整的 UTF
我知道有人提到“软连字符”,但还有很多。
您还可以在缺少空格的语言的单词之间使用“零宽度空格”,这样您就不必依赖字典解释。您还可以将其用作语言中的软连字符,允许在某些点将某些单词分行。
当使用一个您不想破坏的复合词,但您希望文本到语音系统能够正确识别它时,您应该使用“单词分隔符”字符。不要使用“零宽度非破坏空间”,因为它已被弃用,因为它用作 BOM。
最后,如果您想要一个空格但不想换行,请使用一个简单的不间断空格。
【讨论】:
在带有字符串的xml资源文件中成功使用\u200b 软连字符是一个非常有用的工具,适用于 Android 目标 API 21 - \u00AD en.wikipedia.org/wiki/Soft_hyphen 与任何平台一样,html 中常用的“&”快捷方式的可用性取决于它们在应用程序中的使用位置。有些小部件通过处理它们的解析器运行它们的文本,有些则不。如果您使用国际化字符串表函数来处理字符串(您绝对应该这样做),您可以使用 UTF。【参考方案3】:Soft hyphen 使用的是从 Android 4.3 开始的三星 Galaxy 设备。
<!-- key combination to enter soft hyphen: [Alt Gr]+[-] or [Alt]+240 on German PC, see https://de.wikipedia.org/wiki/Weiches_Trennzeichen#Darstellung_auf_Computersystemen -->
<string name="no_connection">Nicht ver-bund-en</string>
由于我的用例非常狭窄,我只在“verbunden”一词中使用了一个软连字符。 Unicode \u00ad 无效。
【讨论】:
我没有按照duden 正确划分这个词。 ;) 也许你应该使用 \u00AD (最后2个位置的大写字母)......对我来说它工作得很好!谢谢!【参考方案4】:以下库支持连字符。它为您执行所有类型的文本对齐(左/右/居中/对齐)和断字。并非所有语言都已添加,但可以根据需要添加。该库使用 NO WEBVIEWS 和 SUPPORTS SPANNABLES 并允许 LONG TEXT。
图书馆:https://github.com/bluejamesbond/TextJustify-Android
ANDROID:2.2 到 5.X
设置
DocumentView documentView = addDocumentView(new StringBuilder("Your long text content"), DocumentView.PLAIN_TEXT);
documentView.getDocumentLayoutParams().setTextAlignment(TextAlignment.JUSTIFIED);
documentView.getDocumentLayoutParams().setHyphenator(new Hyphenator(HyphenPattern.PT));
documentView.getDocumentLayoutParams().setHyphenated(true);
【讨论】:
我们如何在 textView 中设置这个属性?你能修改一下吗?【参考方案5】:这个问题很老,但刚刚为我找到了最佳解决方案:
我不得不说我是用 Xamarin 编程的,所以代码是用 C# 编写的,但移植到 java 中应该不成问题。
我使用 NHyphenator Logic (https://github.com/alkozko/NHyphenator) 插入 SoftHyphens(UTF8 符号 - 0x00AD),因此 Textview 在正确的位置进行断字。
为了获得其他语言的连字符,我使用了 openoffice 词典。 例如我必须获得德语-瑞士语的连字符
http://extensions.openoffice.org/en/search?f[0]=field_project_tags%3A157 1.下载扩展 2.用winrar或其他东西解压 3.复制hyph_xx_xx/hyph_xx_xx.dic文件 4. 向 Hyphenator 类添加新语言
NHyphernator 资源文件声明为: hyph-xx-xx.pat.txt --> 没有 cmets 的 dic 文件的内容 hyph-xx-xx.hyp.txt --> 包含单词异常的文件,其中连字符的逻辑没有给出正确的结果
如果有人想要 Xamarin 的便携式库,请告诉我,我可以上传它。
编辑:
breakstrategy 应该在 TEXtview 中设置为 Balanced。 API 级别 > 23,否则不要使用中断策略。
编辑:
这是单声道/xamarin 代码: https://github.com/sma84/NHyphenator-Mono
【讨论】:
是否可以上传 Xamarin 的可移植库? 刚刚上传。现在添加了 en_gb、en_us、rus 和 de_ch。在自述文件中添加了如何添加新语言。 github.com/sma84/NHyphenator-Mono【参考方案6】:setEllipsize 可能会有所帮助,如果 this 错误尚未修复。
【讨论】:
虽然这在某些情况下会有所帮助,但我真的希望整个文本都可见,但只需在正确的位置进行包装/连字符即可.. 我还没有使用椭圆,但我认为它显示了整个文本。但是,没有关于在通缉的地方断字的线索。以上是关于Android 中的断字的主要内容,如果未能解决你的问题,请参考以下文章