我目前有这种UI结构:
Activity (ACT)
LinearLayout (LL)
HorizontalScrollView (HSV)
RelativeLayout (RL)
当我设置RL的布局参数时,它们直到稍后才会被应用,但为时已晚。
var TotalWidth = GetNewWidth() // eg returns 1000...
var lp = this.LayoutRoot.LayoutParameters;
lp.Width = TotalWidth;
this.LayoutRoot.LayoutParameters = lp;
// this.LayoutRoot.LayoutParameters.Width == 1000
// this.LayoutRoot.Width == 0
this.LayoutRoot.RequestLayout();
this.LayoutRoot.ForceLayout();
this.RequestLayout();
this.ForceLayout();
// this.LayoutRoot.LayoutParameters.Width == 1000
// this.LayoutRoot.Width == 0
如果我没有使用宽度,这不是问题,但我是:) 我想这样做:
this.ScrollTo(500, 0);
这没有效果,因为HSV孩子的总宽度目前为0。
但是,如果我这样做:
this.PostDelayed(() => this.ScrollTo((int) percent, 0), 500);
在延迟500ms后,它可以工作。
HSV是一个派生类,它管理其内容本身 - 只是一个空的RL,我用它来设置宽度,这样我就可以有一个巨大的区域来绘制图像。一个巨大的滚动画布。 此外,我想要做的是在HSV的OnSizeChanged重写成员。我想这样做,如果控件重新调整大小,控件将滚动到相同的位置。宽度取决于高度(保持纵横比)
答案 0 :(得分:1)
您必须等到重新计算布局。当您调用forceLayout
时,布局不会立即发生,它只会被添加到UI线程中的队列中。只要他们获得新的职位和分配的大小,就会为所有相关视图调用onLayout
或onSizeChanged
。你真的无能为力。