设置LayoutParams的速度不够快

时间:2012-07-05 08:35:57

标签: android android-layout xamarin.android

我目前有这种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重写成员。我想这样做,如果控件重新调整大小,控件将滚动到相同的位置。宽度取决于高度(保持纵横比)

1 个答案:

答案 0 :(得分:1)

您必须等到重新计算布局。当您调用forceLayout时,布局不会立即发生,它只会被添加到UI线程中的队列中。只要他们获得新的职位和分配的大小,就会为所有相关视图调用onLayoutonSizeChanged。你真的无能为力。