【问题标题】:on which view lifecycle event can i check chip.getLayout()?我可以在哪个视图生命周期事件上检查chip.getLayout()?
【发布时间】:2023-03-26 15:11:01
【问题描述】:

我有一个芯片视图。

我想检查文本是否为椭圆,如果是,则将文本替换为较短的文本(在运行时)。

我已经看到这个code 来检查芯片中的文本是否是椭圆形的。

Layout l = textview.getLayout();
if (l != null) {
    int lines = l.getLineCount();
    if (lines > 0)
        if (l.getEllipsisCount(lines-1) > 0)
            Log.d(TAG, "Text is ellipsized");
}

但是我不知道我应该在什么生命周期事件中调用这个方法,至于这一行

Layout l = myAccountView.getLayout();

我收到l = null

我有视图生命周期(包含我的芯片的框架布局)

我已尝试检查 onDraw()onLayout()

我也尝试从保存框架的对话框中调用

但我知道通货膨胀是自上而下的,所以它也会在 setContentView() 上返回 l= null

【问题讨论】:

  • 试试onResume()
  • 但通货膨胀不是自上而下吗?意思是孩子没有在父母之前准备好?
  • onResume()onResume() 肯定会为您准备好所有视图
  • 对话没有 onResume
  • 也许是 ViewTreeObserver 之一...侦听器将完成这项工作,例如参见 this post

标签: android text android-lifecycle android-chips ellipsize


【解决方案1】:

方法1:myAccountView.getLayout()之前调用myAccountView.onPreDraw();

方法二:使用 ViewTreeObserver

ViewTreeObserver vtObserver= myAccountView.getViewTreeObserver();
vtObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
       Layout layout = myAccountView.getLayout();  
    }
});

【讨论】:

  • 你不需要调用,系统会调用。我已经给出了解决问题的示例或者,方法是在绘图发生之前使用onPreDraw 请求新布局OR ViewTreeObserver。我的意思是只使用任何而不是两者。推荐的方法是使用ViewTreeObserver
  • 谢谢,我知道这是其中之一。我只是想知道为什么需要myAccountView.onPreDraw() 才能使我的布局不为空。有效。只是想了解为什么明确需要此调用。
猜你喜欢
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多