问题展示

 如上图所示,在普通的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. hive metastore Server 出现异常

    报错信息: 常见问题分析: 1 hive metastore 数据库中用户名或者密码出现更改,并且重启了hive,导致生效但是CDH下没有及时更改hive metastore设置密码 2 Mysql ...

  2. CSS3 转换、过渡和动画

    一.转换 1.属性:transform 取值:none/transform-function(转换函数) 注意:如果要实现多个转换函数的话,可以用空格分开若干transform-function 2. ...

  3. nagios报错HTTP WARNING: HTTP/1.1 403 Forbidden解决方法

    Nagios--localhost报警:"WARNING: HTTP/1.1 403 Forbidden "解决方法: In dashboard it shows alert on ...

  4. Doxygen + Graphviz windows下安装配置(图解)

    查看一些开源代码经常被一些函数的调用关系给绕进去,经过网上查阅资料,发现了这个好用的方法,拿出来和大家分享下安装和应用的过程. 本人常用windows系统,所以主要讲解下windows下相关的内容 要 ...

  5. yii2 创建ActiveForm(表单)

    表单的生成表单中的方法    ActiveForm::begin()方法    ActiveForm::end()方法    getClientOptions()方法    其它方法:errorSum ...

  6. 通过virtualbox最小化安装centos 6.3后无法上网解决办法

    通过virtualbox最小化安装centos 6.3后无法上网解决办法 1.设置virtualbox的网络连接方式,如下图使用桥接方式,桥接的网卡为宿主正在上网的网卡,现在我是通过无线来上网的,所以 ...

  7. html的常用基础应用

    HTML结构   如下一段最简单的HTML代码:<html>     <head>          <title>HTML页面</title>     ...

  8. (转)使用string.Format需要注意的一个性能问题

    今天,我在写C#代码时,突然发现一个最熟悉的陌生人 —— string.Format.在写C#代码的日子里,与它朝夕相伴,却没有真正去了解它.只知道在字符串比较多时,用它比用加号进行字符串连接效率更高 ...

  9. Liunx的DHCP配置

    1.DHCP简介 (1)DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个简化主机IP地址分配管理的TCP/IP标准协议,用户可以利用DHCP服 ...

  10. AspNet.OData 协议概述

    1. 什么是OData? OData 全称 Open Data Protocol,字面理解为开放数据协议,是一个基于Http协议且API实现为Restful风格的协议标准,目前由微软支持大力推广,你可 ...