文章目录

  • 个人极不建议这样做(之后会说原因)
    • 1 现象
    • 2 解决思路
    • 3不推荐的原因

个人极不建议这样做(之后会说原因)

1 现象


绿色底黄色框内的就是原生TextView出现的情况,出现这种情况的主要原因就是分词问题。TextView会认为英文字符在没有空格给开的时候是一个完整的单词(它不局限于字母,也可能不是个单词)在当前行展示不下且在下一行能完整展示的时候,就会出现这种情况。

2 解决思路

手动计算TextView每行能展示多少个字符,手动进行分行(在末尾加空字符或者换行符均可)。

AutoWrapTextView代码:

/*** @author KaraShokZ* DESCRIPTION 解决中英文混排,自动折行问题* @name AutoWrapedTextView**/
public class AutoWrapTextView extends AppCompatTextView {public AutoWrapTextView(@NonNull Context context) {super(context);}public AutoWrapTextView(@NonNull Context context, @Nullable AttributeSet attrs) {super(context, attrs);}public AutoWrapTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}/*** 手动计算TextView每行能展示多少字符,并分行* @param charSequence 目标文本* @return*/public String splitText(CharSequence charSequence) {if (TextUtils.isEmpty(charSequence)) return "";List<StringBuilder> splitTextList = new ArrayList<>();int singleTextWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); // TextView 每行的宽度int currentSingleTextWidth = 0; // 用来叠加字符的宽度StringBuilder lineStringBuffer = new StringBuilder();for (int i = 0, length = charSequence.length(); i < length; i++) {char textChar = charSequence.charAt(i);currentSingleTextWidth += getSingleCharWidth(textChar);if (currentSingleTextWidth > singleTextWidth) {// 当字符宽度大于 TextView 的宽度时,需要折行lineStringBuffer.append(" ");// 末尾加空字符,会强行分词splitTextList.add(lineStringBuffer);lineStringBuffer = new StringBuilder();currentSingleTextWidth = 0;i--;} else {lineStringBuffer.append(textChar);if (i == length - 1) splitTextList.add(lineStringBuffer);}}StringBuilder splitSb = new StringBuilder();int maxLines = getMaxLines();boolean hasMore = splitTextList.size() > maxLines;if (hasMore){// 当所需行数大于最大行数时,手动截取splitTextList = splitTextList.subList(0,maxLines);}for (StringBuilder stringBuilder : splitTextList){splitSb.append(stringBuilder);}if (hasMore){// 当所需行数大于最大行数时,最后一行手动省略末尾(这个只适用于 ellipsize=end)int length = splitSb.length();String three_dots = "...";splitSb.replace(length - three_dots.length() + 1,length - 1,three_dots);}return splitSb.toString();}/*** 计算每个字符的宽度* @param textChar 待计算的字符* @return*/private float getSingleCharWidth(char textChar) {float[] width = new float[1];getPaint().getTextWidths(new char[] {textChar}, 0, 1, width);return width[0];}
}

使用:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val str1 = getText("abcdefghijklm")exploreSpannableEllipsizeTextView1.setMovementMethod(FilterLinkMovementMethod())exploreSpannableEllipsizeTextView1.setHighlightColor(this.getResources().getColor(R.color.white))exploreSpannableEllipsizeTextView1.setText(str1)val str2 = getText("abcdefghijklmnopqrstuvwxyzabcdefghijklmnop")exploreSpannableEllipsizeTextView2.setMovementMethod(FilterLinkMovementMethod())exploreSpannableEllipsizeTextView2.setHighlightColor(this.getResources().getColor(R.color.white))exploreSpannableEllipsizeTextView2.setText(str2)val str3 = getText("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnop")exploreSpannableEllipsizeTextView3.setMovementMethod(FilterLinkMovementMethod())exploreSpannableEllipsizeTextView3.setHighlightColor(this.getResources().getColor(R.color.white))exploreSpannableEllipsizeTextView3.setText(str3)autoWrapTextView1.setMovementMethod(FilterLinkMovementMethod())autoWrapTextView1.setHighlightColor(this.getResources().getColor(R.color.white))autoWrapTextView1.post {val str11 = autoWrapTextView1.splitText(str1)autoWrapTextView1.setText(getText1(str11))}autoWrapTextView2.setMovementMethod(FilterLinkMovementMethod())autoWrapTextView2.setHighlightColor(this.getResources().getColor(R.color.white))autoWrapTextView2.post {val str22 = autoWrapTextView2.splitText(str2)autoWrapTextView2.setText(getText1(str22))}autoWrapTextView3.setMovementMethod(FilterLinkMovementMethod())autoWrapTextView3.setHighlightColor(this.getResources().getColor(R.color.white))autoWrapTextView3.post {val str33 = autoWrapTextView3.splitText(str3)autoWrapTextView3.setText(getText1(str33))}}fun getText(content: String) : SpannableString {var activityName: String  = "#是的冯绍峰#"var contentStrB: StringBuilder = StringBuilder(activityName)contentStrB.append(content)var spannableString: SpannableString = SpannableString(contentStrB.toString())var colorSpan: ForegroundColorSpan = ForegroundColorSpan(this.getResources().getColor(R.color.color_3AA2E1));spannableString.setSpan(colorSpan, 0,activityName.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);var clickableSpan: ExploreContentActivityIntentClickableSpan  = ExploreContentActivityIntentClickableSpan("111");spannableString.setSpan(clickableSpan, 0, activityName.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);return spannableString}fun getText1(content: String) : SpannableString {var activityName: String  = "#是的冯绍峰#"var spannableString: SpannableString = SpannableString(content)var colorSpan: ForegroundColorSpan = ForegroundColorSpan(this.getResources().getColor(R.color.color_3AA2E1));spannableString.setSpan(colorSpan, 0,activityName.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);var clickableSpan: ExploreContentActivityIntentClickableSpan  = ExploreContentActivityIntentClickableSpan("111");spannableString.setSpan(clickableSpan, 0, activityName.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);return spannableString}}

3不推荐的原因

主要有两点:
1、这样会破坏纯英文下的分词,也就是正常情况下当末尾端的英文单词展示不下时,系统会把它折到下一行去。这样的强行干扰会破坏此机制,末尾端的单词可能会被折断。
2、大家可以看到这个计算其实还是有点消耗性能的,就位了这么一点点的所谓的美观,其实有些不值当。因为像微信、微博等都没有处理这种情况。可见这个所谓的优化其实是有点画蛇添足的(当然,产品大大要求除外)。

所以,这里不推荐各位小主去处理这种东西。当然,如果真有这种需求的话,希望可以给小主提供一个思路。

解决Android TextView中英文混排换行问题相关推荐

  1. JustifyTextView 解决TextView中英文混排自动换行的问题

    最近在做着一个项目,里边会显示很长的一段文字,但是这些文字并不会整齐地排列,遇到文字中带有中英文时,果断给我换行了,好无语..接着就是不断地百度百度,找到了一堆一两年前的东西,不是叫你半角转全角,就是 ...

  2. JustifyTextView 解决TextView中英文混排排版问题,android文字排版不齐,

    最近在做着一个项目,里边会显示很长的一段文字,但是这些文字并不会整齐地排列,遇到文字中带有中英文时,果断给我换行了,好无语..接着就是不断地百度百度,找到了一堆一两年前的东西,不是叫你半角转全角,就是 ...

  3. TextView解决中英文混排自动换行

    自定义TextView解决中英文混排自动换行的问题 Textview中设置中英文混合格式的字符串时会自动换行,本文就是解决这个问题的办法,废话不多说直接上代码 点击查看原文: 代码 import an ...

  4. html中英文混排,EndNote中英文混排时et al和等的3种解决方法 | 科研动力

    EndNote对于英文文献的处理很出色,但是对于中文文献的处理就有点别扭,尤其是中英文文献混排时更是不爽.木有关系,EndNote的强大这处之一就是可以驯服和调教.下面介绍3种如何处理中英文混排时et ...

  5. 博士毕业论文英文参考文献换行_一文解决中英参考文献混排问题

    导言 今天要给大家解决的是使用Endnote过程中,参考文献出现的中英文混排问题,如下图所示,在使用国标参考文献格式的时候,英文作者省略用et al.是没问题的,但是中文作者在使用Endnote的时候 ...

  6. CTeX:中英文混排无法正常换行+字体调整+行距调整

    关于无法正常换行:一行与一行有时会参差不齐 参考材料:ctex-faq"中英文混排是为何无法正确分排?" 简单地说,一是英文字符后面要空格,二是中英文字符间要隔开 关于字体调整:\ ...

  7. 参考文献名称怎么复制_[Zotero+Word]Zotero+Word2016参考文献中英文混排,解决et al和等的问题...

    注: 参考文献是用chinese-gb7714-1987-...或chinese-gb7714-2005-...等csl生成的参考文献,也就是英文作者超过3个后面是"等". 其他参 ...

  8. 【转】Endnote中英文混排及输出作者全名的解决办法

    有的期刊在文章发表时要求期刊名及作者名都需要为全名,不能用省略简写名.那么这个一般的设置是很容易的,具体步骤如下: 第一步,这里以<植物遗传资源学报>的格式为例,打开Endnote后,点击 ...

  9. EndNote中英文混排时et al和等的3种解决方法

    EndNote对于英文文献的处理很出色,但是对于中文文献的处理就有点别扭,尤其是中英文文献混排时更是不爽.木有关系,EndNote的强大这处之一就是可以驯服和调教.下面介绍3种如何处理中英文混排时et ...

最新文章

  1. 选美大赛示例 你会选谁
  2. oracle下使用sql命令,ORACLE笔记(2)ORACLE 学习中用到的SQL命令
  3. 【学习笔记】JS进阶语法一document对象
  4. resnet18到resnet152模型pytorch实现
  5. Android渠道包自动化验证
  6. 使用 Blazor 开发内部后台(二):了解 Blazor 组件
  7. python实例化对象做实参_如何在Python中记住类实例化?
  8. 如何避免向下传递回调?
  9. jQuery图片水平滑动延迟加载动画
  10. 27.go list
  11. Hadoop2.7.4 HA centos6.8
  12. 伽玛校正(Gamma Correction)
  13. 解决小程序图片上传问题
  14. 物联网应用技术和计算机应用技术,物联网应用技术专业介绍
  15. mysql的strict,MySQL Strict Mode关闭
  16. day002-2019-07-30
  17. U盘显示0字节怎么恢复完整解决教程
  18. 回收站清空了怎么恢复?快来get实用方法!
  19. Day499500501502503504.马士兵22春招面试题① -面经
  20. 中国人民大学与加拿大女王大学金融硕士——在职读研该如何平衡学习与工作呢

热门文章

  1. 基于GEC6818的智能家居系统
  2. GIS相关数据下载网站、软件和工具等
  3. 利用CE修改内存方法通关
  4. oracle开机启动监听,如何让oracle DB、监听和oem开机启动(dbstart)
  5. 中国商业地产投资专业展览会6月在京举办
  6. 教你如何专业地故弄玄虚,成为一代大神
  7. 使用Subversion版本控制工具
  8. 使用 mysqld_safe 启动 mysqld 服务
  9. 多宝平台将不再为XP提供新的安全升级、非安全修补程序、免费或付费辅助支持
  10. 【中秋佳节】简易爬虫的探讨