【问题标题】:addOnLayoutChangeListener vs addOnGlobalLayoutListener vs post(Runnable r)addOnLayoutChangeListener vs addOnGlobalLayoutListener vs post(Runnable r)
【发布时间】:2015-08-13 17:55:07
【问题描述】:

问题: 假设我们有一个简单的案例:我们有 view 并且我们必须在这个视图上显示一些数据。我们使用静态方法 showData(View view) 来做到这一点。我想知道测量视图布局的确切时刻,我可以访问 getWidth() getHeight() 并确保这是我的视图的最终宽度和高度。

我知道什么:(不确定我是否 100% 正确):

我知道 3 种不同的方法可以做到这一点

  • view.addOnLayoutChangeListener - 我们知道当布局改变时,我们 可以得到高度和宽度
  • view.getViewTreeObserver().addOnGlobalLayoutListener - 就我而言 几乎一样,但我们稍后会得到信息。因为 layoutChange 从子节点到根节点的气泡,以及从根节点到子节点的 globalLayout (对吧?)。
  • view.post(Runnable r) - 正在工作,但我不知道为什么 runnable 是 在测量视图后发布到 ui 线程执行。

问题: 知道该视图已被衡量的最佳方法是什么?为什么?

【问题讨论】:

    标签: android layout view measure


    【解决方案1】:

    了解观看次数的最佳方法是什么?

    最好的方法? OnGlobalLayoutListenerView.getMeasuredHeight()View.getMeasuredWidth()

    为什么?

    因为你妈妈比你自己更了解你,所以最好咨询ViewGroup 了解它的状态,它会自动说明孩子们的情况。

    View.post() 将进程加入 ui 队列。 Ui queue ={1,2},稍后在您调用该行 = {1,2,runnable} 之后。所以肯定会在 1,2 之后运行

    【讨论】:

    • thank u:) 但是 onLayoutChange 也被父视图组调用,那么为什么 OnGlobalLayoutListener 是更好的选择呢?我也想知道 View.post()。因此,如果我调用了方法 showData(View view) 并且下一行是 view.post(Runnable r) 那么 runnable 将在测量视图并具有精确布局后执行?我的意思是 view.post(r) 不能在 showData(View v) 和 onMeasure 之间发生?
    • 当你在一个孩子上调用 View.Gone 时,ViewGroup 将触发 onGlobalLayoutListener ,它可能会调用 onlayoutchange,也就是当边界发生变化时,在 globalLayout 上是家庭的状态,如果有变化,就会通知母亲,当您使用对象动画器为视图设置动画时,它将被触发,这只是一个示例,因此,如果您真的想监视,则需要使用它,而不是经常调用它们, view.post() 就像我说的那样将其排入队列可能是它总是落后于操作系统初始定义的调用,@comte1986 希望它有所帮助
    猜你喜欢
    • 2016-05-31
    • 2012-09-17
    • 2018-08-01
    • 1970-01-01
    • 2013-10-31
    • 2014-05-20
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多