当我知道它正在省略时,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的使用

StaticLayout的介绍/使用

当我在d3.js中执行.data(数据)时,如何跳过数组元素

如何在IOS中禁用自动省略号

Android Canvas - StaticLayout 绘制多行文字

Android Canvas - StaticLayout 绘制多行文字