android ellipsize 多行textview

2024-01-09

我需要省略多行文本视图。我的组件足够大,可以用椭圆显示至少 4 条线,但只显示 2 条线。我尝试更改组件的最小和最大行数,但它没有任何改变。


这是问题的解决方案。它是 TextView 的子类,实际上适用于椭圆化。我发现之前的答案中列出的 android-textview-multiline-ellipse 代码在某些情况下存在错误,并且受 GPL 约束,这对我们大多数人来说并不真正有效。您可以自由地使用此代码,无需注明出处,或者如果您愿意,也可以在 Apache 许可证下使用。请注意,当文本变成椭圆形时,有一个监听器会通知您,我自己发现这非常有用。

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

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

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

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

    private final List<EllipsizeListener> ellipsizeListeners = new ArrayList<EllipsizeListener>();
    private boolean isEllipsized;
    private boolean isStale;
    private boolean programmaticChange;
    private String fullText;
    private int maxLines = -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);
    }

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

    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.maxLines = maxLines;
        isStale = true;
    }

    public int getMaxLines() {
        return maxLines;
    }

    @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 = getMaxLines();
        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();
                while (createWorkingLayout(workingText + ELLIPSIS).getLineCount() > maxLines) {
                    int lastSpace = workingText.lastIndexOf(' ');
                    if (lastSpace == -1) {
                        break;
                    }
                    workingText = workingText.substring(0, lastSpace);
                }
                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(),
                Alignment.ALIGN_NORMAL, lineSpacingMultiplier, lineAdditionalVerticalPadding, false);
    }

    @Override
    public void setEllipsize(TruncateAt where) {
        // Ellipsize settings are not respected
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android ellipsize 多行textview 的相关文章

  • 如何在android中点击画布上绘制的圆圈?

    我正在开发一个人脸检测应用程序 在这个应用程序中 我必须在脸上的眼睛和嘴巴用户可以点击拖动圆圈 在检测到的人脸上根据自己设置位置 因此 所有圆圈都已成功绘制在脸上 但我无法单击特定圆圈并使用缩小选项在整个脸上移动 请建议我有关相同问题的正确
  • 在phonegap中播放本地声音

    我有一个 wav文件在我的www文件夹 我正在使用 jQuery 和以下代码 警报响起 但声音不播放 难道我做错了什么
  • 更改操作栏标题文本颜色

    我正在尝试更改 ActionBar 中标题文本的颜色 但我似乎无法让它工作 这是我尝试使用的风格 在我的应用程序主题中我使用titleTextStyle
  • ActionBarCompat 支持库 android:selectableItemBackground 不起作用

    我正在使用新的 ActionBarCompat 支持库 操作栏中的操作按钮在按下时应更改其背景 它适用于 Android 4 3 但不适用于 Gingerbread 在姜饼中 如果我按下按钮 它不会改变背景 我什至改变了选择器 它再次适用于
  • 相当于Android中的javax.swing.Timer

    有没有类似的东西javax swing Timer在安卓上 我知道如何创建自己的线程 但是有类似摆动计时器的东西吗 您可能正在寻找课程android os CountDownTimer http developer android com
  • Android Studio磁盘空间不足如何解决?

    我随机收到此错误 并且不确定为什么 Android Studio 的磁盘空间变低 Android Studio 系统目录分区磁盘空间不足 Update 此应用程序安装在运行 10 10 1 的 Mac 上 具有 251GB 内部存储和占用
  • 如何在 android-studio 0.3.6 中运行 Gradle 1.9?

    我只是花了一些时间尝试将现有的 android studio 项目从 gradle 1 8 迁移到 gradle 1 9 Final 昨天发布 但失败了19th Nov 我在这里阅读了大多数其他与 gradle 相关的帖子 但没有一个对我有
  • Android 上的硬币识别

    我目前正在开发一个 Android 应用程序 它能够拍摄硬币的现有图像 或者使用内置摄像头扫描单个硬币 非常像 Google Goggles 我正在使用 Android 版 OpenCV 我的问题如下 什么方法最适合使用 OpenCV 在
  • 从Asynctask返回结果

    如果我的 Android 应用程序中有这个后台工作文件 并且它从我的数据库获取数据 我如何将字符串 结果 传递给另一个类 后台工作人员连接到我的服务器 然后使用 php 连接到数据库 public class BackgroundWorke
  • 注销时Firebase facebook按钮android身份验证

    我在我的 Android 应用程序中使用 firebase 并在 facebook SDK 中使用登录 我面临的唯一问题是 当我使用 facebook 登录然后注销时 facebook 登录按钮处于 注销 状态 当我单击它时 它会询问我是否
  • Twitter 集成期间获取访问令牌函数行为不当

    我只是想使用 twitter4j 从我的 Android 应用程序向 Twitter 分享文本 首先 我尝试的是我创建了一个新项目 并且这个特定的代码运行成功 然后我在我的应用程序中混合了该特定代码 登录 Twitter 成功完成 之后我发
  • 如何知道点击的widget id?

    我已经实施了一个widget与ImageButton and a TextView That ImageButton启动一个activity当它被点击时 这activity使用用户在活动上写入的内容更新小部件文本EditText 现在的问题
  • MAT(Eclipse 内存分析器)- 如何从内存转储中查看位图

    I m analyzing memory usage of my Android app with help of Eclipse Memory Analyzer http www eclipse org mat also known as
  • Android 依赖项:apklib 与 aar 文件

    据我了解 apklib包含代码 共享资源Maven aar文件由以下人员分发Gradle The aar与 apklib 的主要区别在于 类被编译并包含在 aar 根目录下的classes jar 中 然而apklib不能包含已编译的类文件
  • 对基本适配器类及其功能的疑问

    我正在尝试自定义列表视图 我使用数组列表添加对象列表 并将其发送到扩展基本适配器的类 当我扩展基本适配器类时 它实现了一些方法 例如 getView 等 在 getView 中 我将其发送到将名称 数据 分配给 XML 格式的自定义菜单的类
  • 改造Android基本且简单的问题

    我的服务器返回简单的 Json 结果 如下所示 message Upload Success 我正在尝试将结果放入改造模型类中 public class MyResponse SerializedName message String me
  • onTouch 给出奇怪的触摸点 Android

    我正在做的事情非常简单 我以前做过 但现在它没有按我的预期运行 无论如何 让我简要解释一下我正在尝试做什么以及我得到了什么 设想 我有一个RelativeLayout其中一个ImageView已放置 现在我设置touchlistener像这
  • 从 AlertDialog 返回值

    我想构建一个函数来创建 AlertDialog 并返回用户输入的字符串 这是我用于创建对话框的函数 如何返回该值 String m Text private String openDialog String title AlertDialo
  • 在 Android SDK 中通过单击按钮更改背景颜色不起作用

    我有一个简单的程序 可以在单击按钮后更改背景颜色 但它不起作用 public class ChangeBackgroundActivity extends Activity Called when the activity is first
  • Android 中带有无尽列表视图滚动的 AsyncTask

    我正在创建一个应用程序 其中我需要有无限的滚动列表视图 我不想在我的应用程序中使用任何库 我在网上看到了一些有助于实现此类列表视图的示例 但我的疑问是 当我的数据来自服务器并在异步任务中进行解析时 如何才能拥有无尽的列表视图 如何从滚动异步

随机推荐

  • Objective-C 中的静态 NSString

    我经常在类实例方法中看到这样的代码片段 static NSString myString This is a string 我似乎不明白为什么这会起作用 这是否只是 objc 等价于仅限于方法范围的 define 我 认为 我理解变量的静态
  • 数组上的“each”/“map”会导致 create_time_zone_conversion_attribute 中的“当您没有预料到时,您有一个 nil 对象”?

    我有一个按钮 它通过 XHR 向 Rails 服务器中的特定操作发送 get 请求 此操作调用我在模型 类别 中定义的函数 该函数执行类似 x Category subcategories 的操作 并在下一行中执行类似 x map id 或
  • 如何将绘图保存到PDF文件中,周围没有大边距[重复]

    这个问题在这里已经有答案了 如果我打印一个情节EPS http en wikipedia org wiki Encapsulated PostScript格式时 EPS 文件的内容完全被绘图占据 但如果我打印一个情节PDF http en
  • 如何选择*加上另一列[重复]

    这个问题在这里已经有答案了 我试图从一个表中选择所有值 然后选择仅运行这些列之一的函数的输出 并将所有这些显示为我的 SQL 查询输出 我这样做的目标是从 Geometry 列创建可用的 WKT 输出 并将其包含在查询结果中 这样我就可以在
  • FabricInvalidAddressException:尝试从 .NET Core 应用程序连接时出现 NamedEndpoint“V2Listener”

    我正在尝试使用以下方式连接到 Service Fabric 应用程序ServiceProxy像这样的类 return ServiceProxy Create
  • php和mysql将记录从一个表复制到另一个表

    我想通过将记录从一个表移动到另一个表来对学生进行存档 这是我尝试使用的代码
  • 您相信 ASP.Net MVC 已准备好投入生产吗?

    我真的很喜欢 Microsoft 承诺将 MVC 引入 Web 为此 我对将我现有的 ASP NET 应用程序之一转换为 MVC 感到兴奋 并想知道我是否操之过急 虽然这个网站正在使用 MVC 但它在技术上仍处于测试阶段 您有什么想法 从
  • Google 容器引擎:访问云存储

    我无法让应用程序默认凭据在 Google 容器引擎中工作 文档说它们适用于 App Engine 和 Compute Engine 但我被告知它们应该透明地传递到在 Container Engine 上运行的容器 这是失败的代码 crede
  • iOS 7 状态栏与导航栏发生冲突

    我的应用程序中有一个视图控制器 在故事板中拖动了一个导航栏 它在 iOS 6 中运行良好 但在 iOS 7 中它看起来像这样 状态栏和导航栏不应相互冲突 我在堆栈溢出上看到过很多这样的问题 但它们对我没有太大帮助 有些问题说我应该使用这个
  • asp.net core 检查中间件中的路由属性

    我正在尝试构建一些 ASP Net core 中间件 需要查看当前路由是否标记为 授权 eg public async Task Invoke HttpContext context if context Request Path Valu
  • 在 PyTables 中,如何创建可变长度的嵌套数组?

    我正在使用 PyTables 2 2 1 w Python 2 6 我想创建一个包含可变长度嵌套数组的表 我搜索了 PyTables 文档和教程示例 PyTables 教程 3 8 http www pytables org docs ma
  • Dojo MVC 的简单登录实现

    有没有关于如何实现简单的登录页面 对话框的示例 我一直在尝试使用 dojo 样板来做到这一点 检查我之前的问题 Dojo MVC 的布局实现 https stackoverflow com questions 10953316 layout
  • 更新会话变量而不刷新页面[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当单击 iframe 外部页面 中的链接时 我需要更新第 1 页上的会话变量 当我点击 iframe 的链接时 会话变量已成功设置 问题是
  • 如何读取.net core api项目中appsetting.json文件中的多个连接字符串

    我有多个连接字符串属性 例如 在 AppSetting json 文件中 connectionstring connection1 datasource1 connection2 datasource2 我想读取控制器或服务文件中的连接字符
  • Phalcon Multi module - 动态模块注册

    大家好 我在 Phalcon 的多模块项目中使用以下结构 modules module1 controllers models views module2 controllers models views module n controll
  • 无法使用 Nuitka 编译 Python

    我正在尝试编译使用 urllib request BeautifulSoup 和 网页浏览器 nuitka python py Nuitka WARNING python py 16 Cannot find urllib request a
  • 使用 Add-on SDK 的 Firefox 插件提供更多存储空间

    我想使用插件生成器开发一个插件 我读到 通过简单的存储 一个人的插件可以有大约 5 MB 的空间 但 5 mgb 的空间不足以容纳我的应用程序 我需要更多 我能做什么 考虑到附加 SDK API 您无法做太多事情 相反 你可以冲出沙箱 ht
  • 什么时候应该在 OCaml 中使用对象?

    通常 OCaml 程序可以使用或不使用对象来编写 什么时候使用物品最有利 什么时候应该避免使用物品 作为一般经验法则 不要使用对象 它们带来的额外复杂性通常并不值得 我认为这也是适用于其他语言的规则 但那是另一回事了 至少对于 OCaml
  • 显示本地时间的 MySQL 时间戳

    我有一个 MySQL 数据库 其中存储的大量数据均采用 UTC 时间的时间戳 当用户查询该数据库时 我希望他们能够在本地时区查看数据 我不想每次都计算偏移量并使用 PHP 代码更改时间戳 还有其他办法吗 您可以使用localtime htt
  • android ellipsize 多行textview

    我需要省略多行文本视图 我的组件足够大 可以用椭圆显示至少 4 条线 但只显示 2 条线 我尝试更改组件的最小和最大行数 但它没有任何改变 这是问题的解决方案 它是 TextView 的子类 实际上适用于椭圆化 我发现之前的答案中列出的 a