您现在的位置是:首页 > 正文

android settext文字换行n,自定义TextView,解决文字换行,\n换行符换行,导致高度计算不对问题(计算ListView高度)...

2024-02-01 01:44:58阅读 1

看了这篇文章之后 确实 楼主写的 要比上边的一段好一些 后来发现还是有计算换行的问题。

发现这篇文章 http://www.jianshu.com/p/d916a667c611

有说关于TextView 有标点符号换行问题

不过textview的折行包含以下规律:

1、半角字符与全角字符混乱所致:这种情况一般就是汉字与数字、英文字母混用。

2、TextView在显示中文的时候标点符号不能显示在一行的行首和行尾,如果一个标点符号刚好在一行的行尾,该标点符号就会连同前一个字符跳到下一行显示。

3、一个英文单词不能被显示在两行中( TextView在显示英文时,标点符号是可以放在行尾的,但英文单词也不能分开 )。

public static String ToDBC(String input) {

char c[] = input.toCharArray();

for (int i = 0; i < c.length; i++) {

if (c[i] == '\u3000') { //空格

c[i] = ' ';

} else if (c[i] > '\uFF00' && c[i] < '\uFF5F') { //半角与全角相差 65248

c[i] = (char) (c[i] - 65248);

}

}

return new String(c);

}

最后结合需求 这样的一点小的改动

public class MTextView extends TextView {

private Context context;

public MTextView(Context context) {

super(context);

// TODO Auto-generated constructor stub

this.context = context;

}

public MTextView(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

this.context = context;

}

public MTextView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

// TODO Auto-generated constructor stub

this.context = context;

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int mode = MeasureSpec.getMode(heightMeasureSpec);

Layout layout = getLayout();

if (layout != null) {

int height = (int) Math.ceil(getMaxLineHeight(ToDBC(this.getText().toString()), mode))

+ getCompoundPaddingTop() + getCompoundPaddingBottom();

int width = getMeasuredWidth();

setMeasuredDimension(width, height);

}

}

private float getMaxLineHeight(String str, int mode) {

float height = 0.0f;

float width = getMeasuredWidth();

float widthPixels = context.getResources().getDisplayMetrics().widthPixels;

//这里具体this.getPaint()要注意使用,要看你的TextView在什么位置,

// 这个是拿TextView父控件的Padding的,为了更准确的算出换行

float pLeft = ((LinearLayout) getParent()).getPaddingLeft();

float pRight = ((LinearLayout) getParent()).getPaddingRight();

//检测字符串中是否包含换行符,获得换行的次数,在之后计算高度时加上

int br = 0;

if (str.contains("\n"))

br = str.split("\n").length - 1;

/**

* wrap_content/未指定宽度(MeasureSpec.UNSPECIFIED),则用屏幕宽度计算

* 否则就使用View自身宽度计算,并且无需计算Parent的Padding

*/

int line;

if (mode == MeasureSpec.UNSPECIFIED)

line = (int)

Math.ceil((this.getPaint().measureText(str) /

(widthPixels - getPaddingLeft() - pLeft - pRight - getPaddingRight())));

else {

line = (int)

Math.ceil((this.getPaint().measureText(str) /

(width - getPaddingLeft() - getPaddingRight())));

}

height = (this.getPaint().getFontMetrics().descent -

this.getPaint().getFontMetrics().ascent) * (line + br);

return height;

}

public static String ToDBC(String input) {

char c[] = input.toCharArray();

for (int i = 0; i < c.length; i++) {

if (c[i] == '\u3000') { //空格

c[i] = ' ';

} else if (c[i] > '\uFF00' && c[i] < '\uFF5F') { //半角与全角相差 65248

c[i] = (char) (c[i] - 65248);

}

}

return new String(c);

}

}

网站文章

  • 并发编程-导致JVM内存泄漏的ThreadLocal

    并发编程-导致JVM内存泄漏的ThreadLocal

    JVM利用设置ThreadLocalMap的Key为弱引用,来避免内存泄露。JVM利用调用remove、get、set方法的时候,回收弱引用。当ThreadLocal存储很多Key为null的Entr...

    2024-02-01 01:44:30
  • Gson将json转Map 浮点型数据精度丢失问题

    Gson将json转Map 浮点型数据精度丢失问题

    今天是1024节,写篇博客纪念下(其实就是想点亮1024勋章,哈哈哈),想到前段时间做flink的数据采集遇到的json转换数值精度问题导致消费端数据转换异常逻辑很简单,就是要将一段json格式的报文转成map,随手用了Gson来转换:Map map=gson.fromJson(mapJson,Map.class);报文中的value值是整型(比如1024),但是转换完就变成...

    2024-02-01 01:44:24
  • list @size 验证_第33期:上海自来水来自海上,回文字符串验证!

    list @size 验证_第33期:上海自来水来自海上,回文字符串验证!

    我准备了 1000 本电子书和计算机各领域高清思维导图 100 张,关注后回复【资源】,即可获取!更可回复【内推】加入 BAT 内推群!01、题目示例见微知著,发现一组数据很有趣,分享给大家。leetcode 第一题通过次数为 993,335,第二题通过次数为 396,160,第三题通过次数为 69,508。我想说什么,请自己悟。第125题:验证回文串给定一个字符串,验证它是否是回文串,...

    2024-02-01 01:44:18
  • PTA练习7-3 将数组中的数逆序存放 (20分)

    本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。输入格式:输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。输出格式:在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。输入样例:410 8 1 2输出样例:2 1 8 10#include ...

    2024-02-01 01:43:46
  • 怎么让steam允许访问自己的计算机,科技教程:电脑steam软件如何解决好友网络无法访问...

    怎么让steam允许访问自己的计算机,科技教程:电脑steam软件如何解决好友网络无法访问...

    如今越来越多的小伙伴对于电脑steam软件如何解决好友网络无法访问这方面的问题开始感兴趣,看似平静的每一天,在每个人身上都在发生着各种各样的故事,因为大家现在都是想要了解到此类的信息,那么既然现在大家...

    2024-02-01 01:43:39
  • shell日期格式Demo

    shell校验日期格式是否合法

    2024-02-01 01:43:32
  • mstar android 怎么连接电脑,Android:Mstar平台 HDMI OUT 静音流程

    一、framework层1. APP调用 AudioManager 的adjustStreamVolume() 接口实现在: frameworks\base\services\core\java\co...

    2024-02-01 01:43:04
  • Docker优化下载镜像速度

    代码】Docker优化下载镜像速度。

    2024-02-01 01:42:59
  • 少女银四失足,偶得“阿里Java神级题库(25专题)”,金九稳了

    少女银四失足,偶得“阿里Java神级题库(25专题)”,金九稳了

    Java面试的时候你被提过哪些问题?网上有很多面经可以参考(各种博客),现在网上一个面经资源比较集中的就是牛客网的笔试面试讨论板块,但是也有一些大神会总结一些互联网大厂的面试题或者一些高频会考到的面试...

    2024-02-01 01:42:52
  • EPICS libCom库(5) -- myfreeList

    EPICS libCom库(5) -- myfreeList

    2024-02-01 01:42:36