解决Android TextView中英文混排换行问题
文章目录
- 个人极不建议这样做(之后会说原因)
- 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中英文混排换行问题相关推荐
- JustifyTextView 解决TextView中英文混排自动换行的问题
最近在做着一个项目,里边会显示很长的一段文字,但是这些文字并不会整齐地排列,遇到文字中带有中英文时,果断给我换行了,好无语..接着就是不断地百度百度,找到了一堆一两年前的东西,不是叫你半角转全角,就是 ...
- JustifyTextView 解决TextView中英文混排排版问题,android文字排版不齐,
最近在做着一个项目,里边会显示很长的一段文字,但是这些文字并不会整齐地排列,遇到文字中带有中英文时,果断给我换行了,好无语..接着就是不断地百度百度,找到了一堆一两年前的东西,不是叫你半角转全角,就是 ...
- TextView解决中英文混排自动换行
自定义TextView解决中英文混排自动换行的问题 Textview中设置中英文混合格式的字符串时会自动换行,本文就是解决这个问题的办法,废话不多说直接上代码 点击查看原文: 代码 import an ...
- html中英文混排,EndNote中英文混排时et al和等的3种解决方法 | 科研动力
EndNote对于英文文献的处理很出色,但是对于中文文献的处理就有点别扭,尤其是中英文文献混排时更是不爽.木有关系,EndNote的强大这处之一就是可以驯服和调教.下面介绍3种如何处理中英文混排时et ...
- 博士毕业论文英文参考文献换行_一文解决中英参考文献混排问题
导言 今天要给大家解决的是使用Endnote过程中,参考文献出现的中英文混排问题,如下图所示,在使用国标参考文献格式的时候,英文作者省略用et al.是没问题的,但是中文作者在使用Endnote的时候 ...
- CTeX:中英文混排无法正常换行+字体调整+行距调整
关于无法正常换行:一行与一行有时会参差不齐 参考材料:ctex-faq"中英文混排是为何无法正确分排?" 简单地说,一是英文字符后面要空格,二是中英文字符间要隔开 关于字体调整:\ ...
- 参考文献名称怎么复制_[Zotero+Word]Zotero+Word2016参考文献中英文混排,解决et al和等的问题...
注: 参考文献是用chinese-gb7714-1987-...或chinese-gb7714-2005-...等csl生成的参考文献,也就是英文作者超过3个后面是"等". 其他参 ...
- 【转】Endnote中英文混排及输出作者全名的解决办法
有的期刊在文章发表时要求期刊名及作者名都需要为全名,不能用省略简写名.那么这个一般的设置是很容易的,具体步骤如下: 第一步,这里以<植物遗传资源学报>的格式为例,打开Endnote后,点击 ...
- EndNote中英文混排时et al和等的3种解决方法
EndNote对于英文文献的处理很出色,但是对于中文文献的处理就有点别扭,尤其是中英文文献混排时更是不爽.木有关系,EndNote的强大这处之一就是可以驯服和调教.下面介绍3种如何处理中英文混排时et ...
最新文章
- 选美大赛示例 你会选谁
- oracle下使用sql命令,ORACLE笔记(2)ORACLE 学习中用到的SQL命令
- 【学习笔记】JS进阶语法一document对象
- resnet18到resnet152模型pytorch实现
- Android渠道包自动化验证
- 使用 Blazor 开发内部后台(二):了解 Blazor 组件
- python实例化对象做实参_如何在Python中记住类实例化?
- 如何避免向下传递回调?
- jQuery图片水平滑动延迟加载动画
- 27.go list
- Hadoop2.7.4 HA centos6.8
- 伽玛校正(Gamma Correction)
- 解决小程序图片上传问题
- 物联网应用技术和计算机应用技术,物联网应用技术专业介绍
- mysql的strict,MySQL Strict Mode关闭
- day002-2019-07-30
- U盘显示0字节怎么恢复完整解决教程
- 回收站清空了怎么恢复?快来get实用方法!
- Day499500501502503504.马士兵22春招面试题① -面经
- 中国人民大学与加拿大女王大学金融硕士——在职读研该如何平衡学习与工作呢