首页 > 代码库 > 安卓TextView限定行数最大值,点击按钮显示所有内容
安卓TextView限定行数最大值,点击按钮显示所有内容
问题展示
如上图所示,在普通的TextView中,要求:
- 最多显示3行
- 超过三行显示展开按钮
- 且点击展开按钮显示完整内容
这个需求看似简单,但解决起来会遇到两个较为棘手的问题:1,如何判断是否填满了前三行? 2,textview在未完全渲染前无法拿到实际的属性。
解决思路:
- 写好布局文件,隐藏展开按钮
- 填充数据,判断数据是否塞满前三行
- 根据上一步的判断结果,选择隐藏和显示展开按钮
具体步骤:
布局文件此处省略,很简单只有一个TextView和一个Button,并设置Button隐藏。
首先,为了控制最大行数,设置TextView的属性MaxLines = 3。
接下来是两个比较关键的步骤:
1 为了判断数据是否填满了前三行,采用下面的函数进行判断,其中tv_content为展示内容的TextView
private boolean judgeFull(){ return tv_content.getPaint().measureText(tv_content.getText().toString()) > 3*(tv_content.getWidth() - tv_content.getPaddingRight() - tv_content.getPaddingLeft()); }
思路很简单,即计算三行所能提供的最大尺寸和所有文字所需要的尺寸,对二者进行比较即可
2 根据上一步得到的返回值,如果返回为true ,则说明已经塞满了数据,此时让Button显示,对Button添加点击事件,点击以后让设置MaxLines=100,这里就不上代码了,很简单。
此时我以为已经可以了,没想到又遇到了一个问题,即,TextView渲染是需要时间的,如果在获取到TextView并setText()之后立马进行判断,会发现此时TextView还没有绘制出来,拿到的属性均为初始值,比如前面函数中调用的getWidth返回为0,这样显然是不对的。怎么解决呢?
不卖关子了,方法就是采用TextView的一个方法,即post()方法,该方法的参数为Runnable,在Runnable里面进行判断就能保证此时TextView已经是绘制好的了。代码如下:
tv_content.post(new Runnable() { @Override public void run() { if(judgeFull()){ ll_more.setVisibility(View.VISIBLE); }else { ll_more.setVisibility(View.GONE); } } });
安卓TextView限定行数最大值,点击按钮显示所有内容
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。