问题展示

 如上图所示,在普通的TextView中,要求:

  1. 最多显示3行
  2. 超过三行显示展开按钮
  3. 且点击展开按钮显示完整内容

  这个需求看似简单,但解决起来会遇到两个较为棘手的问题:1,如何判断是否填满了前三行?   2,textview在未完全渲染前无法拿到实际的属性。

解决思路:

  1. 写好布局文件,隐藏展开按钮
  2. 填充数据,判断数据是否塞满前三行
  3. 根据上一步的判断结果,选择隐藏和显示展开按钮

具体步骤:

  布局文件此处省略,很简单只有一个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限定行数最大值,点击按钮显示所有内容的更多相关文章

  1. android获取textview的行数

    最近项目需求,需要获取Textview的行数,通过行数与TextView的maxLines进行比较来确定是否显示TextView下方的展开按钮是否显示,废话少说直接上代码,mTextView.getL ...

  2. TextView 获取行数,某一行的内容,某行的宽度

    获取行数 ViewTreeObserver vto = textView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlob ...

  3. Android 获取View的高度或TextView的行数, 实现自适应的textview

    大家都遇到过项目中需要获控件的的高度或者列如文章开头说TextView的行数 但是很多人在实际操作中getLineCount()获取到值是零,其实只是我们没在正确的位置获取. 这是因为activtiy ...

  4. 获取指定开始行数$start,跨度$limit的文件内容

    // 获取指定开始行数$page,跨度$step的文件内容 function getLine($file_name, $start, $limit) { $f = new SplFileObject( ...

  5. React 点击按钮显示div与隐藏div,并给div传children

    最近做了一个react的点击按钮显示与隐藏div的一个小组件: [筛选]组件FilterButton import React,{Component} from 'react'; import {re ...

  6. 点击按钮显示隐藏DIV,点击DIV外面隐藏DIV

    点击按钮显示隐藏DIV,点击DIV外面隐藏DIV 注意:此方法对touch事件不行,因为stopPropagation并不能阻止touchend的冒泡 <style type="tex ...

  7. JavaScript点击按钮显示 确认对话框

    //JavaScript点击按钮显示确认对话框 <html xmlns="http://www.w3.org/1999/xhtml"> <head> < ...

  8. Android:TextView最小行数设置

    我们有时候为了保证TextView必须有一个最小的高度,那么就需要设置这个行数. 因为如果你不设置的话,在measure这个TextView的时候,此时就无法准确的得到一个最小高度.因为设备不同,所以 ...

  9. js构建函数,点击按钮显示div,再点击按钮或其他区域,隐藏div

    这只是一个例子,先看看效果: html代码: <nav> <span class="nav_logo"></span> <h1>云蚂 ...

随机推荐

  1. 【Flex】读取本地JSON,然后JSON数据转成XML数据

    package utils { import flash.xml.XMLDocument; import flash.xml.XMLNode; import mx.rpc.xml.SimpleXMLE ...

  2. Python之路-Linux命令基础(3)

    作业一: 1)将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) 2)将用户信息数据库文件和用户密码数据库文件纵向合并为一个文件/2.txt(追加) 3)将/1.txt./2 ...

  3. webpack快速掌握教程

    转载http://yijiebuyi.com/blog/46fb97b11fb8f4055e0b04d1cecb1f69.html #为什么用webpack 如果我们 前端 javascript 能像 ...

  4. 老李推荐:第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态

    老李推荐:第14章5节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态   poptest是国内唯一 ...

  5. mysql 4 索引的优缺点

    为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能. 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. 第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因. 第 ...

  6. python css概述

    1. 概述 css是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化. 存在方式有三种:元素内联.页面嵌入和外部引入,比较三种方式的优缺点. 语法:style ...

  7. 删除 vim 命令

    x 删除当前光标下的字符dw 删除光标之后的单词剩余部分.d$ 删除光标之后的该行剩余部分.dd 删除当前行. c 功能和d相同,区别在于完成删除操作后进入INSERT MODEcc 也是删除当前行, ...

  8. dubbo个人总结

    dubbo,分布式服务框架,RPC服务框架. 注册中心zk,redis......,使用大多为zk 注册流程 最后一图 服务提供者启动时向/dubbo/com.foo.BarService/provi ...

  9. WebForm捆绑压缩js和css(WebForm Bundling and Minification)

    .net framework 4以上,可以使用Microsoft.AspNet.Web.Optimization 新建4.0项目 Nuget搜索optimization,安装第一个包 加入Bundle ...

  10. UEditor使用------图片上传与springMVC集成 完整实例

    UEditor是一个很强大的在线编辑软件 ,首先讲一下 基本的配置使用 ,如果已经会的同学可以直接跳过此节 ,今天篇文章重点说图片上传; 一  富文本的初始化使用: 1 首先将UEditor从官网下载 ...