我有一个应用程序在运行时在屏幕上显示控件,它会在视图上调用measure
的每个控件,其宽度为WRAP_CONTENT
,高度为describe('Controllers Autocomplete', () => {
it('should inject the empty suggestions container', () => {
let a = 1;
let b = 2;
expect(a).toNotEqual(b);
});
});
。
在视图上设置任何数据之前执行此操作以显示视图的模板版本,然后在视图上设置实际数据之后。
问题在于,由于它使用相同的输入调用两次测量,第二次我们点击测量缓存并且即使视图的实际测量值已经改变,它也不会重新测量,因为控件上的数据已经改变。
有没有办法强制它在第二次通话时重新测量?
答案 0 :(得分:0)
我还没有找到清除缓存的方法,但是如果其中一个值是免费的,那么看起来缓存不匹配可能与此类似:
int fakeSpace = (int) (Math.random() * 9999999);
int spec = View.MeasureSpec.makeMeasureSpec(fakeSpace, View.MeasureSpec.UNSPECIFIED);
view.measure(spec, spec);
答案 1 :(得分:0)
您可以使用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;
}