0

我目前有这个 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);

延迟 500 毫秒后,它起作用了。

HSV 是一个派生类,它自己管理其内容 - 只是一个空的 RL,我用它来设置宽度,以便我可以有一个巨大的区域来绘制图像。一种巨大的滚动画布。此外,我想要做的是在 HSV 的 OnSizeChanged 覆盖成员中。我想这样做,如果重新调整控件的大小,控件会滚动到相同的位置。宽度取决于高度(保持纵横比)

4

1 回答 1

1

您必须等到重新计算布局。当您调用forceLayout布局时不会立即发生,它只是被添加到 UI 线程中的队列中。onLayout或者onSizeChanged一旦他们获得新的位置和大小,就会被所有涉及的视图调用。你真的无能为力。

于 2012-07-05T08:56:18.797 回答