设置maxLines=2,ellipseSize=end,判断文本内容是否超出,显示省略号

TextView的两个属性

1、maxLines : 能显示的最大的行数,如设置maxLines=”2”则最大显示的行数为2,如果文本内容不够两行,就会将内容显示全
2、ellipseSize : 文本缩略显示位置控制,有三个值:start,middle end 分别表示当文本内容显示不下时,在文本的开始,中间,和结束显示’…’
通常maxLines和ellipseSize是结合使用的

需求

让一段不固定的文本最多显示两行,超过两行的文本在两行的结尾显示’…’同时,显示出消息详情的按钮,点击就可以进入查看消息的详细内容,如果不超过2行就显示全,不会出现消息详情的按钮,点击没有任何的反应

找到解决问题的经过

本来以为设置了maxLines和ellipseSize的属性之后,使用setText的方法设置的内容之后,在使用getText方法就可以得到带有省略号的文本,不过还是too young and simple 使用getText的方法获取到的文本是源文本内容。
仔细查找源码设置EllipseSize的方法都在TextUtils的方法里,然后仔细阅读TextUtils方法里的内容就找到了这个方法:

/**
     * Returns the original text if it fits in the specified width
     * given the properties of the specified Paint,
     * or, if it does not fit, a truncated
     * copy with ellipsis character added at the specified edge or center.
     */
    public static CharSequence ellipsize(CharSequence text,
                                         TextPaint p,
                                         float avail, TruncateAt where) {
        return ellipsize(text, p, avail, where, false, null);
    }

这个方法就是返回经过处理的后的字符串,参数解释:
CharSequence text :输入的文本内容
TextPaint p : Paint的拓展类
float avail : 显示文本的内容的长度,超出这个长度就显示’…’
TruncateAt where : 设置缩略的地方

这样我们就可以利用该方法来获取到是否文本被截取了:

        //设置消息内容
        String originStr=mData.get(position);
        holder.mOverSizeText.setText(originStr);
        //
        Log.d("原文本",""+holder.mOverSizeText.getText());
        TextView overText=holder.mOverSizeText;
        //截取文本
        //在设置第三个参数的时候,需要考虑到TextView实际占用的宽度,我在xml文件里设置了padding 15dp
        //所以在计算实际宽度的时候需要减去30dp的宽度才是实际TextView占用的宽度
        //因为第三个参数是控制从哪里开始添加省略号的,
        // 比如一段3行的文字,先计算了总的长度,3*l 如果要在第二行末尾显示省略号,那么第三个参数需要传2*l
        String ellipseStr= TextUtils.ellipsize(originStr,
                overText.getPaint(),
                overText.getMaxLines()*(AppContext.deviceWidth- DimensionUtil.dip2px(mContext,30)),
                overText.getEllipsize()).toString();
        Log.d("截取后的文本",ellipseStr);
04-01 16:31:58.677 5386-5386/? D/原文本: 《海贼王》漫画860话的情报出来了,婚礼茶会马上就要开始,各方宾客都陆续抵达会场。而会场的安保工作也是进入到了最高状态,这时候之前一直都没有露面的最后一位3星将登场了,夏洛特·卡塔库里有着高达10亿5700万贝利的悬赏金,而且他的能力貌似能够预见未来。感觉卡彭他们的计划真是十分危险了。
04-01 16:31:58.700 5386-5386/? D/截取后的文本: 《海贼王》漫画860话的情报出来了,婚礼茶会马上就要开始,各方宾客都陆续抵达会场。而会场的安保…
04-01 16:31:58.716 5386-5386/? D/原文本: Google已经做好了随时使用Daydream VR的准备。支持Daydream的设备允许访问和体验一系列支持该格式的网页,允许通过Chrome浏览器作为入口直接获得虚拟现实体验。
04-01 16:31:58.727 5386-5386/? D/截取后的文本: Google已经做好了随时使用Daydream VR的准备。支持Daydream的设备允许访问和体验一系列支持该格…
04-01 16:31:58.737 5386-5386/? D/原文本: 世界上最难学的语言是汉语,没有之一
04-01 16:31:58.739 5386-5386/? D/截取后的文本: 世界上最难学的语言是汉语,没有之一

通过对比原文本和截取过后的文本发现还是相差了一个字符左右,不过这也不算影响太大,我们只需判断截取过后的字符串是否包含’..’或者’…’就可以判断是否超过了最大行数的限制

        //判断截取过后的文本是否包含有..或者...有的话就相当于超过了MaxLines
        if (ellipseStr.contains(mContext.getResources().getString(R.string.ellipsis_end_two_dots))||
                ellipseStr.contains(mContext.getResources().getString(R.string.ellipsis_end_three_dots))){
            holder.mTextDetail.setVisibility(View.VISIBLE);
            convertView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    UIHelper.showMsg(mContext,"点击了消息详情");
                }
            });
        }else {
            holder.mTextDetail.setVisibility(View.GONE);
        }

省略号资源文件

    <string name="ellipsis_end_two_dots">\u2025</string>
    <string name="ellipsis_end_three_dots">\u2026</string>

效果截图,
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值