当我知道它正在省略时,StaticLayout getEllipsisCount 返回 0?
Posted
技术标签:
【中文标题】当我知道它正在省略时,StaticLayout getEllipsisCount 返回 0?【英文标题】:StaticLayout getEllipsisCount returning 0 when I know it's ellipsizing? 【发布时间】:2011-07-02 08:41:48 【问题描述】:所以我有一个扩展的 TextView,我试图从中创建一个 StaticLayout,以便我可以通过调用 getEllipsisCount 来检测文本是否离开屏幕。
所以我在 TextView 中构建静态布局,如下所示:
layout = new StaticLayout(getText(), getPaint(), getWidth(), Alignment.ALIGN_NORMAL, 0f, 0f, false);
但即使 layout.getLineCount() 返回正确的行数,getEllipsisCount(n) 也永远不会返回 > 0,即使我可以清楚地看到它添加了省略号。
所以我猜这已经成为检测文本是否离开屏幕的不好方法......那么有谁知道更合适的方法,或者如何让它工作?
【问题讨论】:
会不会是需要先绘制StaticLayout?有没有办法绘制只是为了测试省略号,而不向用户显示? 在哪里可以确定文本视图是否被椭圆化? 不,我相信必须先绘制文本,然后才能返回有效值。但我最初问这个是为了创建另一个问题的解决方案,看看你需要什么:***.com/questions/5033012/… 文本包含换行符时发生在我身上。删除它们修复了省略计算。 【参考方案1】:我在 android 4.2.2 上也遇到了这个问题。我可以通过使用ViewTreeObserver API 为 onGlobalLayout 事件设置回调并从那里启动延迟的可运行对象来解决它:
ViewTreeObserver observer = _someView.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
@Override
public void onGlobalLayout()
_somView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
_textView.postDelayed(new Runnable()
public void run()
// Code that uses ellipsis detection here
, 10);
);
诚然,这有点骇人听闻,但这是我可以正确检测到省略号的唯一方法,否则它只会不断报告没有发生省略号。在我的测试中,延迟对于它的工作是必不可少的,但是整个事情执行得足够快,因此可以根据这些信息隐藏/显示元素,而不会出现 ui 闪烁。
【讨论】:
+1 感谢 - 能够将其与_textView.post
一起使用,而不是 .postDelayed
。以上是关于当我知道它正在省略时,StaticLayout getEllipsisCount 返回 0?的主要内容,如果未能解决你的问题,请参考以下文章
自定义控件玩套路以及canvas StaticLayout的使用
当我在d3.js中执行.data(数据)时,如何跳过数组元素