如何清除安卓设备上的测量缓存

3

我有一个应用程序,在运行时在屏幕上布置控件,它通过调用提供了宽度和WRAP_CONTENT高度的View的measure方法来遍历每个控件。

它在视图设置任何数据之前执行此操作,以显示视图的模板版本,然后在实际数据设置在视图上之后再执行一次。

问题是,由于它两次使用相同的输入调用了measure,因此第二次我们命中了测量缓存,并且即使控件上的数据已更改,它也不会重新测量。

是否有任何方法可以强制它在第二次调用时重新测量?


我通过创建一个子类并添加一个measureActually方法来解决了这个问题,该方法调用onMeasure(因为onMeasure是受保护的)。显然,我也希望清除缓存 :-/ - Stefan Haustein
2个回答

1
你可以使用View.forceLayout来使缓存失效并强制进行完整的布局处理。
源代码显示其功能:
/**
 * Forces this view to be laid out during the next layout pass.
 * This method does not call requestLayout() or forceLayout()
 * on the parent.
 */
public void forceLayout() {
    if (mMeasureCache != null) mMeasureCache.clear();

    mPrivateFlags |= PFLAG_FORCE_LAYOUT;
    mPrivateFlags |= PFLAG_INVALIDATED;
}

0

我还没有找到清除缓存的方法,但如果其中一个值是UNSPECIFIED,则可以通过类似以下方式强制进行缓存不匹配:

int fakeSpace = (int) (Math.random() * 9999999);
int spec = View.MeasureSpec.makeMeasureSpec(fakeSpace, View.MeasureSpec.UNSPECIFIED);
view.measure(spec, spec);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接