安卓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限定行数最大值,点击按钮显示所有内容的更多相关文章
- android获取textview的行数
最近项目需求,需要获取Textview的行数,通过行数与TextView的maxLines进行比较来确定是否显示TextView下方的展开按钮是否显示,废话少说直接上代码,mTextView.getL ...
- TextView 获取行数,某一行的内容,某行的宽度
获取行数 ViewTreeObserver vto = textView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlob ...
- Android 获取View的高度或TextView的行数, 实现自适应的textview
大家都遇到过项目中需要获控件的的高度或者列如文章开头说TextView的行数 但是很多人在实际操作中getLineCount()获取到值是零,其实只是我们没在正确的位置获取. 这是因为activtiy ...
- 获取指定开始行数$start,跨度$limit的文件内容
// 获取指定开始行数$page,跨度$step的文件内容 function getLine($file_name, $start, $limit) { $f = new SplFileObject( ...
- React 点击按钮显示div与隐藏div,并给div传children
最近做了一个react的点击按钮显示与隐藏div的一个小组件: [筛选]组件FilterButton import React,{Component} from 'react'; import {re ...
- 点击按钮显示隐藏DIV,点击DIV外面隐藏DIV
点击按钮显示隐藏DIV,点击DIV外面隐藏DIV 注意:此方法对touch事件不行,因为stopPropagation并不能阻止touchend的冒泡 <style type="tex ...
- JavaScript点击按钮显示 确认对话框
//JavaScript点击按钮显示确认对话框 <html xmlns="http://www.w3.org/1999/xhtml"> <head> < ...
- Android:TextView最小行数设置
我们有时候为了保证TextView必须有一个最小的高度,那么就需要设置这个行数. 因为如果你不设置的话,在measure这个TextView的时候,此时就无法准确的得到一个最小高度.因为设备不同,所以 ...
- js构建函数,点击按钮显示div,再点击按钮或其他区域,隐藏div
这只是一个例子,先看看效果: html代码: <nav> <span class="nav_logo"></span> <h1>云蚂 ...
随机推荐
- Java进阶之多线程
多线程 多线程(multiple thread)是计算机实现多任务并行处理的一种方式. 在单线程情况下,计算机中存在一个控制权,并按照顺序依次执行指令.单线程好像是一个只有一个队长指挥的小队,整个小队 ...
- Java进阶之内存管理与垃圾回收
Java是在JVM所虚拟出的内存环境中运行的.内存分为栈(stack)和堆(heap)两部分.我们将分别考察这两个区域. 栈 在Java中,JVM中的栈记录了线程的方法调用.每个线程拥有一个栈.在某个 ...
- 老李分享:持续集成学好jenkins之安装
老李分享:持续集成学好jenkins之安装 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq: ...
- 使用原生 JavaScript 操作 DOM
原文:https://www.sitepoint.com/dom-manipulation-vanilla-javascript-no-jquery/ 微软官方放弃了 IE10-,所以现在可以放心使用 ...
- 迭代的是人,递归的是神。——L. Peter Deutsch
递归,数学里面叫recursion,其实就是递推关系. 中学数学有一部分其实就是递归的非常典型的做法,不过老师们都没怎么扩展,新课标必修五第二章数列应该算是我们第一次接触递推的概念了. 其实说到递归 ...
- [Python]再学 socket 之非阻塞 Server
再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...
- NuGet(Nuget Packages)
Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展.在使用Visual Studio开发基于.NET Framework的应用时,Nuget能把在项目中添加.移除和更新引 ...
- JAVA Struts2 搭建
java struts 2搭建 1.web工程 2.将struts2 用到的jar包,拷贝到webcontent/webinf/lib文件夹.下 3.webcontent 下的web.xml 下 ...
- OpenGL 的空间变换(下):空间变换
通过本文的上篇 OpenGL 的空间变换(上):矩阵在空间几何中的应用 ,我们了解到矩阵的基础概念.并且掌握了矩阵在空间几何中的应用.接下来,我们将结合矩阵来了解 OpenGL 的空间变换. 在使用 ...
- .NET跨平台实践:再谈用C#开发Linux守护进程
Linux守护进程是Linux的后台服务进程,相当于Windows服务进程,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是开发守护进程,还可以拓展 ...