【问题标题】:How to know whether the layout process is finished?如何知道布局过程是否完成?
【发布时间】:2017-03-10 00:15:49
【问题描述】:

我需要在我的客户视图中调用requestLayout(),但我注意到了

当视图层次当前处于布局过程中时不应调用此方法 ({@link #isInLayout()}。

所以我决定使用这个代码:

if(isInLayout()) {
    // request layout later
} else {
    requestLayout();
}

但问题是我不知道以后怎么请求布局,可以用addOnLayoutChangeListener吗?

就像这样:

addOnLayoutChangeListener(new OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        requestLayout();
    }
});

【问题讨论】:

    标签: android android-layout view


    【解决方案1】:

    如果您想在正在进行的布局传递完成后请求新布局,请查看ViewTreeObserver.OnPreDrawListenerPreDraw() 方法。

    onPreDraw

    boolean onPreDraw ()

    即将绘制视图树时调用的回调方法。此时,树中的所有视图都已被测量并给出了一个框架。客户可以使用它来调整他们的滚动范围,甚至在绘制之前请求一个新的布局。

    ViewTreeObserver.OnPreDrawListener 接口中还有其他方法可能也是您正在寻找的方法。


    您还可以查看post(),它是View 的一部分。 (请参阅文档here)。我相信您发布的Runnable 将在视图上的布局完成后执行。这可能是您正在寻找的更多内容。还请查看已接受的答案Stack Overflow question.

    【讨论】:

    • 好答案!看来post(runnable) 是最好的方法,我将在requestLayout() 中使用这种方法。非常感谢。
    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多