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

艾特九哥 2016-03-15 01:24:57

如图所示,文本字数多了的话最后显示省略号,问题是,怎么控制最后一行省略号的位置还有“简介全文”这个怎么放个什么控件,怎么实现?有没有做过的,求指点
...全文
15648 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_27411971 2017-10-26
  • 打赏
  • 举报
回复
引用 18 楼 u013290250 的回复:
[quote=引用 17 楼 a631855639 的回复:] [quote=引用 16 楼 liu4113231988 的回复:] [quote=引用 15 楼 a631855639 的回复:] [quote=引用 14 楼 liu4113231988 的回复:] [quote=引用 9 楼 a631855639 的回复:] 这个要动态判断是否省略号,查看全文使用SpannableString
就是这个意思[/quote] 如果需要,可以给你Util[/quote] 你做过类似的效果吗?能不能发一个看看啊,谢谢啦[/quote]

/**
     * 设置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);
    }
[/quote] R.string.info_more R.string.ellipsis R.color.text_more 把这几个贴出来,谢谢[/quote] 如果把这个放进listview中的每一个item里面呢?还能不能显示了?除了点击全文进入另一个页面,其他功能一样
艾特九哥 2016-03-18
  • 打赏
  • 举报
回复
引用 22 楼 u013290250 的回复:
[quote=引用 19 楼 a631855639 的回复:] R.string.info_more == 你的查看全文 R.string.ellipsis == 省略号 R.color.text_more==查看全文的字体颜色 这几个你可以自定义
还有一个 info_less[/quote] 你也是要实现这个功能效果吗?这个怎么样,你的能实现吗?
shidangche 2016-03-17
  • 打赏
  • 举报
回复
* textview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { * @Override * public boolean onPreDraw() { * mTvInfo.getViewTreeObserver().removeOnPreDrawListener(this); * NDTextUtil.setEllipsize(...) * return true; * } * }); mTvinfo 是什么还有在mTvinfo 怎么定义
画虎烂 2016-03-17
  • 打赏
  • 举报
回复
R.string.info_more == 你的查看全文 R.string.ellipsis == 省略号 R.color.text_more==查看全文的字体颜色 这几个你可以自定义
怀君 2016-03-17
  • 打赏
  • 举报
回复
引用 17 楼 a631855639 的回复:
[quote=引用 16 楼 liu4113231988 的回复:] [quote=引用 15 楼 a631855639 的回复:] [quote=引用 14 楼 liu4113231988 的回复:] [quote=引用 9 楼 a631855639 的回复:] 这个要动态判断是否省略号,查看全文使用SpannableString
就是这个意思[/quote] 如果需要,可以给你Util[/quote] 你做过类似的效果吗?能不能发一个看看啊,谢谢啦[/quote]

/**
     * 设置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);
    }
[/quote] R.string.info_more R.string.ellipsis R.color.text_more 把这几个贴出来,谢谢
怀君 2016-03-17
  • 打赏
  • 举报
回复
引用 19 楼 a631855639 的回复:
R.string.info_more == 你的查看全文 R.string.ellipsis == 省略号 R.color.text_more==查看全文的字体颜色 这几个你可以自定义
还有一个 info_less
OceanWong1991 2016-03-16
  • 打赏
  • 举报
回复
android:lines="2" android:ellipsize="end"
qq_26763799 2016-03-16
  • 打赏
  • 举报
回复
textview的xml里不是有这两个属性? android:maxLength="" 放的文字的最大长度 android:ellipsize="end" 省略号出现的位置
画虎烂 2016-03-16
  • 打赏
  • 举报
回复
这个要动态判断是否省略号,查看全文使用SpannableString
画虎烂 2016-03-16
  • 打赏
  • 举报
回复
引用 16 楼 liu4113231988 的回复:
[quote=引用 15 楼 a631855639 的回复:] [quote=引用 14 楼 liu4113231988 的回复:] [quote=引用 9 楼 a631855639 的回复:] 这个要动态判断是否省略号,查看全文使用SpannableString
就是这个意思[/quote] 如果需要,可以给你Util[/quote] 你做过类似的效果吗?能不能发一个看看啊,谢谢啦[/quote]

/**
     * 设置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);
    }
艾特九哥 2016-03-16
  • 打赏
  • 举报
回复
引用 15 楼 a631855639 的回复:
[quote=引用 14 楼 liu4113231988 的回复:] [quote=引用 9 楼 a631855639 的回复:] 这个要动态判断是否省略号,查看全文使用SpannableString
就是这个意思[/quote] 如果需要,可以给你Util[/quote] 你做过类似的效果吗?能不能发一个看看啊,谢谢啦
画虎烂 2016-03-16
  • 打赏
  • 举报
回复
引用 14 楼 liu4113231988 的回复:
[quote=引用 9 楼 a631855639 的回复:] 这个要动态判断是否省略号,查看全文使用SpannableString
就是这个意思[/quote] 如果需要,可以给你Util
艾特九哥 2016-03-16
  • 打赏
  • 举报
回复
引用 9 楼 a631855639 的回复:
这个要动态判断是否省略号,查看全文使用SpannableString
就是这个意思
艾特九哥 2016-03-16
  • 打赏
  • 举报
回复
引用 11 楼 GeorgeFree 的回复:
android:lines="2" android:ellipsize="end"
这个不可控,效果不是我需要的
艾特九哥 2016-03-16
  • 打赏
  • 举报
回复
引用 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); } } } 试试吧。。。[/quote] 我试试先,谢谢啦
ganshenml 2016-03-15
  • 打赏
  • 举报
回复
引用 4 楼 liu4113231988 的回复:
[quote=引用 1 楼 ganshenml 的回复:] 140个字符判断+TextView右侧相对布局看看能不能实现
这个地方字符是可多可少的,最多差不多就是5行吧,我一个朋友说计算字符串宽度然后处理的方法,计算宽度后怎么截取呢,郁闷了[/quote] 突然有个想法,将这摘要内容进行HTML码处理,然后TextView显示出来的时候对HTML解析支持,查看全文这里自动加上相应的HTML标签,这样就不用担心它怎么布局了,因为就单单一个TextView就给处理了,看看能不能行?
xingzhong128 2016-03-15
  • 打赏
  • 举报
回复
if (lastIndex > lastCount) { 这句应该是lastIndex-firstIndex > lastCount 希望对楼主有用
xingzhong128 2016-03-15
  • 打赏
  • 举报
回复
引用 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); } } } 试试吧。。。
艾特九哥 2016-03-15
  • 打赏
  • 举报
回复
引用 3 楼 u010668114 的回复:
上面说的都能实现,但是有一个难点,就是如果规定固定的字数长度,会因为屏幕尺寸不同,所以最后一行剩余空间不同,导致不一定能放得下简介全文四个字,就可能出现重叠现象。
字符长度不定的,可多可少,总共是5行的
艾特九哥 2016-03-15
  • 打赏
  • 举报
回复
引用 1 楼 ganshenml 的回复:
140个字符判断+TextView右侧相对布局看看能不能实现
这个地方字符是可多可少的,最多差不多就是5行吧,我一个朋友说计算字符串宽度然后处理的方法,计算宽度后怎么截取呢,郁闷了
加载更多回复(3)

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧