2012-07-05 3 views
0

В настоящее время я эта структура пользовательского интерфейса:Установка LayoutParams не будет применена достаточно быстро

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. Я хочу сделать так, чтобы, если элемент управления изменен, управление прокручивается до той же позиции. Ширина зависит от высоты (сохраняет пропорции)

ответ

1

Вам придется подождать, пока ваш макет был пересчитан. Когда вы вызываете forceLayout, макетирование происходит не сразу, оно просто добавляется в очередь в потоке пользовательского интерфейса. onLayout или onSizeChanged будут вызваны для всех задействованных представлений, как только они получат свои новые позиции и размеры. Вы ничего не можете с этим поделать.

+0

Я надеялся, что мое предположение было неправильным. Это не так. Благодарю. – Matthew

Смежные вопросы