热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TextView设置显示省略号

限制TextView显示的字符数,多出的部分显示省略号。效果图如下:自定义EllipsizingTextView.java,(com.example.user.helloworld.Ellipsizi

限制TextView显示的字符数,多出的部分显示省略号。

效果图如下:



自定义EllipsizingTextView.java,(com.example.user.helloworld.EllipsizingTextView)内容如下:

public class EllipsizingTextView extends TextView {
private static final String ELLIPSIS = "...";

private boolean isStale;
private boolean programmaticChange;
private String fullText;
private int maxLength = -1;

public EllipsizingTextView(Context context) {
super(context);
}

public EllipsizingTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public EllipsizingTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

/**
* 外部通过调用setMaxLength方法设置显示的最多字数为maxLength
* @param maxLength
*/
public void setMaxLength(int maxLength) {
this.maxLength = maxLength;
}

public int getMaxLength(){
return maxLength;
}

@Override
protected void onTextChanged(CharSequence text, int start, int before, int after) {
super.onTextChanged(text, start, before, after);
if (!programmaticChange) {
fullText = text.toString();
isStale = true;
}
}

@Override
protected void onDraw(Canvas canvas) {
if (isStale) {
super.setEllipsize(null);
resetText();
}
super.onDraw(canvas);
}

private void resetText() {
int len = fullText.length();
String workingText = fullText;
if (maxLength != -1) {
if (len > maxLength) {
workingText = fullText.substring(0, maxLength).trim();
workingText = workingText + ELLIPSIS;
}
}
if (!workingText.equals(getText())) {
programmaticChange = true;
try {
setText(workingText);
} finally {
programmaticChange = false;
}
}
isStale = false;
}

}


如何使用呢?

1. Activity布局文件actiivty_main.xml中使用此自定义TextView,如下:

    android:id="@+id/tv_content"
android:layout_
android:layout_
android:text="Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。"
android:maxLines="10"/>


2. 在Activity代码中获取EllipsizingTextView对象,首先定义EllipsizingTextView对象。

private EllipsizingTextView tv_content;
3.在onCreate(Bundle savedInstanceState)方法中获取tv_content对象,如下:
tv_cOntent= (EllipsizingTextView) findViewById(R.id.tv_content);
4.设置最多显示字符数(设置最多显示120字符,超出部分使用省略号显示),如下:
tv_content.setMaxLength(120);
通过这种方式,适用于当行和多行的情况。

如果单行文本显示不完整末尾显示省略号,就简单多了。
只需要在activity的布局文件,TextView节点添加属性:android:singleLine="true"和android:ellipsize="end"即可,如下:
    android:layout_
android:layout_
android:singleLine="true"
android:text="Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。"
android:ellipsize="end"/>

如果限制显示指定的行数,超出指定的行数显示省略号。已经有人自定义了
EllipsizingTextView类。
原文地址:http://code.taobao.org/p/android_jiudu/src/trunk/Forlind/src/com/wine/jiubang/ui/view/EllipsizingTextView.java 点击打开链接
代码如下:

package com.example.user.helloworld;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class EllipsizingTextView extends TextView {

private static final String ELLIPSIS = "...";

public interface EllipsizeListener {
void ellipsizeStateChanged(boolean ellipsized);
}

private final List ellipsizeListeners = new ArrayList();

private boolean isEllipsized;
private boolean isStale;
private boolean programmaticChange;
private String fullText;
private int mMaxLines = -1;
private float lineSpacingMultiplier = 1.0f;
private float lineAdditiOnalVerticalPadding= 0.0f;

public EllipsizingTextView(Context context) {
super(context);
}

public EllipsizingTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// 开始没加这两行的时候,一直不对,maxlinex在textChange里面会被改变为-1
TypedArray a = context.obtainStyledAttributes(attrs, new int[] { android.R.attr.maxLines });
setMaxLines(a.getInt(0, 2));
a.recycle();
}

public EllipsizingTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// 开始没加这两行的时候,一直不对,maxlinex在textChange里面会被改变为-1
TypedArray a = context.obtainStyledAttributes(attrs, new int[] { android.R.attr.maxLines });
setMaxLines(a.getInt(0, 2));
a.recycle();
}

public void addEllipsizeListener(EllipsizeListener listener) {
if (listener == null) {
throw new NullPointerException();
}
ellipsizeListeners.add(listener);
}

public void removeEllipsizeListener(EllipsizeListener listener) {
ellipsizeListeners.remove(listener);
}

public boolean isEllipsized() {
return isEllipsized;
}

@Override
public void setMaxLines(int maxLines) {
super.setMaxLines(maxLines);
this.mMaxLines = maxLines;
isStale = true;
}

public int getMaxLine() {
return mMaxLines;
}

public int getTextLines(){
return createWorkingLayout(fullText).getLineCount();
}
@Override
public void setLineSpacing(float add, float mult) {
this.lineAdditiOnalVerticalPadding= add;
this.lineSpacingMultiplier = mult;
super.setLineSpacing(add, mult);
}

@Override
protected void onTextChanged(CharSequence text, int start, int before, int after) {
super.onTextChanged(text, start, before, after);
if (!programmaticChange) {
fullText = text.toString();
isStale = true;
}
}

@Override
protected void onDraw(Canvas canvas) {
if (isStale) {
super.setEllipsize(null);
resetText();
}
super.onDraw(canvas);
}

private void resetText() {
int maxLines = getMaxLine();
String workingText = fullText;
boolean ellipsized = false;
if (maxLines != -1) {
Layout layout = createWorkingLayout(workingText);
if (layout.getLineCount() > maxLines) {

workingText = fullText.substring(0, layout.getLineEnd(maxLines - 1)).trim();
Layout layout2 = createWorkingLayout(workingText + ELLIPSIS);
while (layout2.getLineCount() > maxLines) {
workingText = workingText.substring(0, workingText.length() - 1 - 1);
layout2 = createWorkingLayout(workingText + ELLIPSIS);
}
workingText = workingText + ELLIPSIS;
ellipsized = true;
}
}
if (!workingText.equals(getText())) {
programmaticChange = true;
try {
setText(workingText);
} finally {
programmaticChange = false;
}
}
isStale = false;
if (ellipsized != isEllipsized) {
isEllipsized = ellipsized;
for (EllipsizeListener listener : ellipsizeListeners) {
listener.ellipsizeStateChanged(ellipsized);
}
}
}

private Layout createWorkingLayout(String workingText) {
return new StaticLayout(workingText, getPaint(), getWidth() - getPaddingLeft()
- getPaddingRight(), Layout.Alignment.ALIGN_NORMAL, lineSpacingMultiplier,
lineAdditionalVerticalPadding, false);
}

@Override
public void setEllipsize(TextUtils.TruncateAt where) {
// Ellipsize settings are not respected } }
}
}

使用方法:

1 Activity类的布局文件activity_main.xml使用此自定义View,如下:

        android:id="@+id/etv"
android:layout_
android:layout_
android:text="Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。"/>
2 Activity类查找该组件
private EllipsizingTextView tv_cOntent= (EllipsizingTextView)findViewById(R.id.etv);tv_content.setMaxLines(5);

最终实现的效果是:少于5行内容全部显示,超出5行内容不显示,且第5行末尾显示省略号。












推荐阅读
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 多维数组的使用
    本文介绍了多维数组的概念和使用方法,以及二维数组的特点和操作方式。同时还介绍了如何获取数组的长度。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
author-avatar
Joke-晓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有