android中textview蚊子多显示省略号以及布局实现

作者:超级管理员 更新时间:2017-10-26 17:58:34 来源:未知 点击:15642
如图所示,文本字数多了的话最后显示省略号,问题是,怎么控制最后一行省略号的位置还有“简介全文”这个怎么放个什么控件,怎么实现?有没有做过的,求指点---------------------------

如图所示,文本字数多了的话最后显示省略号,问题是,怎么控制最后一行省略号的位置还有“简介全文”这个怎么放个什么控件,怎么实现?有没有做过的,求指点
-------------------------------
140个字符判断+TextView右侧相对布局看看能不能实现
-------------------------------
用framelayout啊。简介全文 设置在右下角,前面用textview,做个字符串长度判断。
-------------------------------
上面说的都能实现,但是有一个难点,就是如果规定固定的字数长度,会因为屏幕尺寸不同,所以最后一行剩余空间不同,导致不一定能放得下简介全文四个字,就可能出现重叠现象。
-------------------------------
引用 1 楼 ganshenml 的回复:
140个字符判断+TextView右侧相对布局看看能不能实现

这个地方字符是可多可少的,最多差不多就是5行吧,我一个朋友说计算字符串宽度然后处理的方法,计算宽度后怎么截取呢,郁闷了
-------------------------------
引用 3 楼 u010668114 的回复:
上面说的都能实现,但是有一个难点,就是如果规定固定的字数长度,会因为屏幕尺寸不同,所以最后一行剩余空间不同,导致不一定能放得下简介全文四个字,就可能出现重叠现象。

字符长度不定的,可多可少,总共是5行的
-------------------------------
引用 2 楼 wei220000 的回复:
用framelayout啊。简介全文 设置在右下角,前面用textview,做个字符串长度判断。

首先在xml文件里不要给textview设置ellipse,maxlines等参数 不要设置 不要设置  不要设置 说三遍
然后运行添加textview.getViewTreeObserver().addOnGlobalLayout(new OnGlobal...{

Paint paint = new Piant();
paint..setTextSize(文本的大小);
int detailLength = (int) paint.measureText("简介全文"); // 简介全文的宽度
int textviewwidth = textView.getMeasureWidth(); // textview的宽度
int charwidth = detaillength / 4; // 一个字符的宽度
int lastCount = (textviewwidth - detailLength) / charwidth; // 最后一行能显示的字符数

int lines = textview.getLayout().getLineCount();
 int lastindex = textview.getLayout().getLineEnd(lines -1); //最后一行最后一个字符
int firstIndex = textview.getLayout().getLineStart(lines - 1) ; // 最后一行第一个字符


String realText = textView.getText().toString();
String showText = null;
if (lastIndex > lastCount) {
      showText = realText.subString(0, firstIndex + lastCount - 3) + "...";
} else {
    showText = realText.substring(0, realText.length() - 3) + "...";
}

textview.setText(showText);
}
}
}

试试吧。。。
-------------------------------
if (lastIndex > lastCount) { 这句应该是lastIndex-firstIndex > lastCount
希望对楼主有用
-------------------------------
引用 4 楼 liu4113231988 的回复:
Quote: 引用 1 楼 ganshenml 的回复:

140个字符判断+TextView右侧相对布局看看能不能实现

这个地方字符是可多可少的,最多差不多就是5行吧,我一个朋友说计算字符串宽度然后处理的方法,计算宽度后怎么截取呢,郁闷了

突然有个想法,将这摘要内容进行HTML码处理,然后TextView显示出来的时候对HTML解析支持,查看全文这里自动加上相应的HTML标签,这样就不用担心它怎么布局了,因为就单单一个TextView就给处理了,看看能不能行?
-------------------------------
这个要动态判断是否省略号,查看全文使用SpannableString
-------------------------------
textview的xml里不是有这两个属性?
android:maxLength=""  放的文字的最大长度
android:ellipsize="end"  省略号出现的位置
-------------------------------
android:lines="2"
android:ellipsize="end"
-------------------------------
引用 6 楼 xingzhong128 的回复:
Quote: 引用 2 楼 wei220000 的回复:

用framelayout啊。简介全文 设置在右下角,前面用textview,做个字符串长度判断。

首先在xml文件里不要给textview设置ellipse,maxlines等参数 不要设置 不要设置  不要设置 说三遍
然后运行添加textview.getViewTreeObserver().addOnGlobalLayout(new OnGlobal...{

Paint paint = new Piant();
paint..setTextSize(文本的大小);
int detailLength = (int) paint.measureText("简介全文"); // 简介全文的宽度
int textviewwidth = textView.getMeasureWidth(); // textview的宽度
int charwidth = detaillength / 4; // 一个字符的宽度
int lastCount = (textviewwidth - detailLength) / charwidth; // 最后一行能显示的字符数

int lines = textview.getLayout().getLineCount();
 int lastindex = textview.getLayout().getLineEnd(lines -1); //最后一行最后一个字符
int firstIndex = textview.getLayout().getLineStart(lines - 1) ; // 最后一行第一个字符


String realText = textView.getText().toString();
String showText = null;
if (lastIndex > lastCount) {
      showText = realText.subString(0, firstIndex + lastCount - 3) + "...";
} else {
    showText = realText.substring(0, realText.length() - 3) + "...";
}

textview.setText(showText);
}
}
}

试试吧。。。


我试试先,谢谢啦
-------------------------------
引用 11 楼 GeorgeFree 的回复:
android:lines="2"
android:ellipsize="end"


这个不可控,效果不是我需要的
-------------------------------
引用 9 楼 a631855639 的回复:
这个要动态判断是否省略号,查看全文使用SpannableString

就是这个意思
-------------------------------
引用 14 楼 liu4113231988 的回复:
Quote: 引用 9 楼 a631855639 的回复:

这个要动态判断是否省略号,查看全文使用SpannableString

就是这个意思

如果需要,可以给你Util
-------------------------------
引用 15 楼 a631855639 的回复:
Quote: 引用 14 楼 liu4113231988 的回复:

Quote: 引用 9 楼 a631855639 的回复:

这个要动态判断是否省略号,查看全文使用SpannableString

就是这个意思

如果需要,可以给你Util

你做过类似的效果吗?能不能发一个看看啊,谢谢啦
-------------------------------
引用 16 楼 liu4113231988 的回复:
Quote: 引用 15 楼 a631855639 的回复:

Quote: 引用 14 楼 liu4113231988 的回复:

Quote: 引用 9 楼 a631855639 的回复:

这个要动态判断是否省略号,查看全文使用SpannableString

就是这个意思

如果需要,可以给你Util

你做过类似的效果吗?能不能发一个看看啊,谢谢啦


/**
     * 设置TextView 显示更多
     * 使用方法:
     * textview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
     *  @Override
     *  public boolean onPreDraw() {
     *  mTvInfo.getViewTreeObserver().removeOnPreDrawListener(this);
     *  NDTextUtil.setEllipsize(...)
     *  return true;
     *   }
     *   });
     * @param textView
     * @param originalText 原始行数
     * @param ellipsizeLine 更多状态下显示的最多行数
     */
    public static void setEllipsize(final Context context, final TextView textView, final String originalText, final int ellipsizeLine){
        if(TextUtils.isEmpty(originalText) || TextUtils.isEmpty(textView.getText().toString())){
            return;
        }
        String more = context.getResources().getString(R.string.info_more);
        String ellipsized = TextUtils.ellipsize(textView.getText(), textView.getPaint(), (float) textView.getWidth() * ellipsizeLine, TextUtils.TruncateAt.END).toString();
        final String ellipsis = context.getResources().getString(R.string.ellipsis);
        if(!ellipsized.endsWith(ellipsis) && !ellipsized.endsWith("...")) {
            textView.setText(originalText);
            return;
        }

        String[] nextLine = ellipsized.split("\n");
        if(nextLine.length > ellipsizeLine){
            Matcher slashMatcher = Pattern.compile("\n").matcher(ellipsized);
            int mIdx = 0;
            while(slashMatcher.find()) {
                mIdx++;
                //当换行符第ellipsizeLine出现的位置
                if(mIdx == ellipsizeLine){
                    break;
                }
            }
            int ellipPos = slashMatcher.start();
            ellipsized = ellipsized.substring(0, ellipPos);
        }
        //替换[更多]的位置点
        int changePos = ellipsized.length() - (ellipsis).length() - more.length() - 2;
        String endStr = ellipsized.substring(changePos < 0 ? 0:changePos, ellipsized.length() - 1);
        String result;
        //如果要截取替换[更多]的字符串包括换行符,则直接把[more]加在文字末尾
        if(endStr.contains("\n")){
            result = ellipsized + more;
        }
        else {
            String tmp = ellipsized.substring(0, changePos < 0 ? 0:changePos);
            result = tmp + (ellipsis) + more;
        }
        textView.setMovementMethod(LinkMovementMethod.getInstance());
        SpannableString spannable = new SpannableString(result);
        ClickableSpan click = new ClickableSpan() {

            @Override
            public void onClick(View widget) {
                String less = context.getResources().getString(R.string.info_less);
                String newText = originalText + less;
                SpannableString spannable = new SpannableString(newText);
                ClickableSpan fullClick = new ClickableSpan() {
                    @Override
                    public void onClick(View widget) {
                        setEllipsize(context, textView, originalText, 2);
                    }

                    @Override
                    public void updateDrawState(TextPaint ds) {
                        ds.setUnderlineText(false);
                        ds.clearShadowLayer();
                    }
                };
                spannable.setSpan(fullClick, 0, newText.length(), SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
                spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.text_more)),
                        newText.length() - less.length(), newText.length(), SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
                textView.setText(spannable);
            }

            @Override
            public void updateDrawState(TextPaint ds) {
                ds.setUnderlineText(false);
                ds.clearShadowLayer();
            }
        };
        spannable.setSpan(click, 0, result.length(), SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
        spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.text_more)),
                result.length() - more.length(), result.length(), SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
        textView.setText(spannable);
    }
-------------------------------
引用 17 楼 a631855639 的回复:
Quote: 引用 16 楼 liu4113231988 的回复:

Quote: 引用 15 楼 a631855639 的回复:

Quote: 引用 14 楼 liu4113231988 的回复:

Quote: 引用 9 楼 a631855639 的回复:

这个要动态判断是否省略号,查看全文使用SpannableString

就是这个意思

如果需要,可以给你Util

你做过类似的效果吗?能不能发一个看看啊,谢谢啦


/**
     * 设置TextView 显示更多
     * 使用方法:
     * textview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
     *  @Override
     *  public boolean onPreDraw() {
     *  mTvInfo.getViewTreeObserver().removeOnPreDrawListener(this);
     *  NDTextUtil.setEllipsize(...)
     *  return true;
     *   }
     *   });
     * @param textView
     * @param originalText 原始行数
     * @param ellipsizeLine 更多状态下显示的最多行数
     */
    public static void setEllipsize(final Context context, final TextView textView, final String originalText, final int ellipsizeLine){
        if(TextUtils.isEmpty(originalText) || TextUtils.isEmpty(textView.getText().toString())){
            return;
        }
        String more = context.getResources().getString(R.string.info_more);
        String ellipsized = TextUtils.ellipsize(textView.getText(), textView.getPaint(), (float) textView.getWidth() * ellipsizeLine, TextUtils.TruncateAt.END).toString();
        final String ellipsis = context.getResources().getString(R.string.ellipsis);
        if(!ellipsized.endsWith(ellipsis) && !ellipsized.endsWith("...")) {
            textView.setText(originalText);
            return;
        }

        String[] nextLine = ellipsized.split("\n");
        if(nextLine.length > ellipsizeLine){
            Matcher slashMatcher = Pattern.compile("\n").matcher(ellipsized);
            int mIdx = 0;
            while(slashMatcher.find()) {
                mIdx++;
                //当换行符第ellipsizeLine出现的位置
                if(mIdx == ellipsizeLine){
                    break;
                }
            }
            int ellipPos = slashMatcher.start();
            ellipsized = ellipsized.substring(0, ellipPos);
        }
        //替换[更多]的位置点
        int changePos = ellipsized.length() - (ellipsis).length() - more.length() - 2;
        String endStr = ellipsized.substring(changePos < 0 ? 0:changePos, ellipsized.length() - 1);
        String result;
        //如果要截取替换[更多]的字符串包括换行符,则直接把[more]加在文字末尾
        if(endStr.contains("\n")){
            result = ellipsized + more;
        }
        else {
            String tmp = ellipsized.substring(0, changePos < 0 ? 0:changePos);
            result = tmp + (ellipsis) + more;
        }
        textView.setMovementMethod(LinkMovementMethod.getInstance());
        SpannableString spannable = new SpannableString(result);
        ClickableSpan click = new ClickableSpan() {

            @Override
            public void onClick(View widget) {
                String less = context.getResources().getString(R.string.info_less);
                String newText = originalText + less;
                SpannableString spannable = new SpannableString(newText);
                ClickableSpan fullClick = new ClickableSpan() {
                    @Override
                    public void onClick(View widget) {
                        setEllipsize(context, textView, originalText, 2);
                    }

                    @Override
                    public void updateDrawState(TextPaint ds) {
                        ds.setUnderlineText(false);
                        ds.clearShadowLayer();
                    }
                };
                spannable.setSpan(fullClick, 0, newText.length(), SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
                spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.text_more)),
                        newText.length() - less.length(), newText.length(), SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
                textView.setText(spannable);
            }

            @Override
            public void updateDrawState(TextPaint ds) {
                ds.setUnderlineText(false);
                ds.clearShadowLayer();
            }
        };
        spannable.setSpan(click, 0, result.length(), SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
        spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.text_more)),
                result.length() - more.length(), result.length(), SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
        textView.setText(spannable);
    }

R.string.info_more
R.string.ellipsis
R.color.text_more
把这几个贴出来,谢谢
-------------------------------
R.string.info_more == 你的查看全文
R.string.ellipsis == 省略号
R.color.text_more==查看全文的字体颜色
这几个你可以自定义
-------------------------------
* textview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
     *  @Override
     *  public boolean onPreDraw() {
     *  mTvInfo.getViewTreeObserver().removeOnPreDrawListener(this);
     *  NDTextUtil.setEllipsize(...)
     *  return true;
     *   }
     *   });
  mTvinfo  是什么还有在mTvinfo 怎么定义
-------------------------------
该回复于2016-03-17 15:56:30被管理员删除
-------------------------------
引用 19 楼 a631855639 的回复:
R.string.info_more == 你的查看全文
R.string.ellipsis == 省略号
R.color.text_more==查看全文的字体颜色
这几个你可以自定义

还有一个 info_less
-------------------------------
引用 22 楼 u013290250 的回复:
Quote: 引用 19 楼 a631855639 的回复:

R.string.info_more == 你的查看全文
R.string.ellipsis == 省略号
R.color.text_more==查看全文的字体颜色
这几个你可以自定义

还有一个 info_less

你也是要实现这个功能效果吗?这个怎么样,你的能实现吗?
-------------------------------
引用 18 楼 u013290250 的回复:
Quote: 引用 17 楼 a631855639 的回复:

Quote: 引用 16 楼 liu4113231988 的回复:

Quote: 引用 15 楼 a631855639 的回复:

Quote: 引用 14 楼 liu4113231988 的回复:

Quote: 引用 9 楼 a631855639 的回复:

这个要动态判断是否省略号,查看全文使用SpannableString

就是这个意思

如果需要,可以给你Util

你做过类似的效果吗?能不能发一个看看啊,谢谢啦


/**
     * 设置TextView 显示更多
     * 使用方法:
     * textview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
     *  @Override
     *  public boolean onPreDraw() {
     *  mTvInfo.getViewTreeObserver().removeOnPreDrawListener(this);
     *  NDTextUtil.setEllipsize(...)
     *  return true;
     *   }
     *   });
     * @param textView
     * @param originalText 原始行数
     * @param ellipsizeLine 更多状态下显示的最多行数
     */
    public static void setEllipsize(final Context context, final TextView textView, final String originalText, final int ellipsizeLine){
        if(TextUtils.isEmpty(originalText) || TextUtils.isEmpty(textView.getText().toString())){
            return;
        }
        String more = context.getResources().getString(R.string.info_more);
        String ellipsized = TextUtils.ellipsize(textView.getText(), textView.getPaint(), (float) textView.getWidth() * ellipsizeLine, TextUtils.TruncateAt.END).toString();
        final String ellipsis = context.getResources().getString(R.string.ellipsis);
        if(!ellipsized.endsWith(ellipsis) && !ellipsized.endsWith("...")) {
            textView.setText(originalText);
            return;
        }

        String[] nextLine = ellipsized.split("\n");
        if(nextLine.length > ellipsizeLine){
            Matcher slashMatcher = Pattern.compile("\n").matcher(ellipsized);
            int mIdx = 0;
            while(slashMatcher.find()) {
                mIdx++;
                //当换行符第ellipsizeLine出现的位置
                if(mIdx == ellipsizeLine){
                    break;
                }
            }
            int ellipPos = slashMatcher.start();
            ellipsized = ellipsized.substring(0, ellipPos);
        }
        //替换[更多]的位置点
        int changePos = ellipsized.length() - (ellipsis).length() - more.length() - 2;
        String endStr = ellipsized.substring(changePos < 0 ? 0:changePos, ellipsized.length() - 1);
        String result;
        //如果要截取替换[更多]的字符串包括换行符,则直接把[more]加在文字末尾
        if(endStr.contains("\n")){
            result = ellipsized + more;
        }
        else {
            String tmp = ellipsized.substring(0, changePos < 0 ? 0:changePos);
            result = tmp + (ellipsis) + more;
        }
        textView.setMovementMethod(LinkMovementMethod.getInstance());
        SpannableString spannable = new SpannableString(result);
        ClickableSpan click = new ClickableSpan() {

            @Override
            public void onClick(View widget) {
                String less = context.getResources().getString(R.string.info_less);
                String newText = originalText + less;
                SpannableString spannable = new SpannableString(newText);
                ClickableSpan fullClick = new ClickableSpan() {
                    @Override
                    public void onClick(View widget) {
                        setEllipsize(context, textView, originalText, 2);
                    }

                    @Override
                    public void updateDrawState(TextPaint ds) {
                        ds.setUnderlineText(false);
                        ds.clearShadowLayer();
                    }
                };
                spannable.setSpan(fullClick, 0, newText.length(), SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
                spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.text_more)),
                        newText.length() - less.length(), newText.length(), SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
                textView.setText(spannable);
            }

            @Override
            public void updateDrawState(TextPaint ds) {
                ds.setUnderlineText(false);
                ds.clearShadowLayer();
            }
        };
        spannable.setSpan(click, 0, result.length(), SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
        spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.text_more)),
                result.length() - more.length(), result.length(), SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
        textView.setText(spannable);
    }

R.string.info_more
R.string.ellipsis
R.color.text_more
把这几个贴出来,谢谢




如果把这个放进listview中的每一个item里面呢?还能不能显示了?除了点击全文进入另一个页面,其他功能一样

推荐阅读

热门内容

android中textview蚊子多显

如图所示,文本字数多了的话最后显示省略号...

【请教大神】webview如何引入swf

我在/res/raw中放入了一个.swf...

模拟器上可以显示我解析的json数据,但

本帖最后由ds1995于2016-05-...

如何层次显示图片缩略图?

如何像下图这样的层次感显示3个缩略图?没...

Android 在 Eclipse 中关

求大佬帮帮忙,很烦这个问题-------...

打开AndroidStudio出现Sta

昨天还可以打开,今天早上打开就出现这个报...

求助!!!关于二级评论的数据错位问题

之前看了通过Android Listvi...

安卓开发一些新手问题

第一个问题为什么会报错?第二个问题为什么...

tablayout的tab能将图标放大点

本帖最后由qq_37587427于201...

请问一下状态栏怎么实现渐变

如图所示,TOOLBAR实现了渐变(通过...

最新内容

javax.mail包问题

请问为啥获取的BodyPart输入流,不管怎么处理,下载超过几兆得的文件,很慢,...

Mybatis的mapper.xml中$和#的区别?

#使用↓and t.`requestControllerMethod` like...

两个对象相等的问题

String VIP_DB= PropertiesConfig.getPrope...

linux 下escplise Java ee 怎么调试

-------------------------------图中是语法错误  ...

json参数中出现{怎么办?

请求参数如下{ "objectId": "89966b87b7e6a3de7de...

求大神解惑下关于java读取txt的问题

有那种能用java处理txt文件的大神吗求解答,我被这个问题困惑很久了,下面的数...

通过webservice将数据库A的数据insert,update到b数据库,这样有没有需要优化的地方

客户端服务连接数据库A,服务器端服务连接数据库B,每天定时从数据库A,捞取用户数...

servlet返回的拼接字符串中文,返回显示jsp为????,请问如何解决

如下为前台jsp,ajax代码$(function(){  $("#name")...

<#if ()??>${}标签的用法?

<#if (category.name)??>${category.name}<...

怎么用变量来接收数组中每个值

前台获取一个复选框的内容之后用一个数组传到后台,怎么用变量来接收?-------...

老哥们,shiro求助。

//登录时触发判断是否记住密码,记住放入cookie,否则清除cookie fu...

33岁想转行做编程,难不难啊?

本帖最后由Simon9268于2017-09-0910:26:25编辑大家好,我...

Tomcat乱码问题 catalina.bat设置为UTF-8 控制台出现乱码

求助:1、catalina.bat中必须设置为UTF-8,如果我不设置为UTF-...

如何调用银联接口下载对账单啊

本帖最后由weixin_35520317于2017-05-2614:48:58编...

java itext7生成带图片的pdf和数字签名的pdf,图片大小和位置不对应?

最近几天在用 itextpdf 弄 pdf 签章的功能,签章后图片位置一直调不正...

iPhone X 适配

公司app适配起来比较琐碎,很多第三方库编译的时候没有支持模拟器的版本,所以我只...

应届生程序员迷茫之极。

明年毕业,前段时间刚进了一家深圳的小公司做Java开发。之前安排的任务基本都只完...

Zend Studio 13.6中怎么设置调试

如题,Zend Studio 13.6中怎么设置调试。-------------...

SEO最应该花精力的地方

SEO从中学到什么?评估员们都是普通用户,他们也不一定有时间真的看内容,真看也不...

急!!!麻烦大家看看我这异常吧

这个项目在同事的电脑上跑一点问题没有,到了我的电脑上就会出现这个问题,,麻烦给看...