2013-12-02 2 views
1

У меня есть две точки зрения, позволяет сказать, что А и В. Я хочу, чтобы располагаться над B по вертикали, но выровнен по центру с B Горизонтально, т.е. я хочу достичь этого:RelativeLayout LayoutParam Над

enter image description here

Я пробовал:

RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) 
    viewA.getLayoutParams(); 
layoutParams.addRule(
    RelativeLayout.ABOVE, 
    viewB.getId() 
); 

но очевидно, что он сделал это размещение вертикально над B, но по горизонтали плавающей влево (в соответствие с левой Х)

Пожалуйста, помогите.

ответ

1

То, что вы на правильном пути, но вы должны также добавить правило для горизонтального центрирования: layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);

я признаю, что это не совсем то, что вы просили, что он уточняет, что вы в горизонтальном положении в родительском представлении, а не указывать, что вы выравниваете горизонтальные центры A и B, но нет прямого способа сделать последнее с правилом RelativeLayout. (Есть много косвенных способов сделать это вместо него.)


Дополнение
Учитывая, что ваш взгляд A не по центру по горизонтали в родителе, вот предложение. Я не знаю, как это сделать, но я считаю, что, поскольку правила RelativeLayout применяются во время прохождения измерений, вы можете использовать левые (и правые) координаты вида A после того, как измерение выполнено для установки (public) left и right свойства вида B в зависимости от того, что им нужно для того, чтобы центрировать вид под A.

Так, например, если ваш родительский вид является пользовательским расширением View вы можете переопределить его метод onMeasure(), называют как:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); // So that mA.left and mA.right first get set... 
    mB.left = BWIDTH - (mA.left + mA.right)/2; 
    mB.right = mB.left + BWIDTH; 
    /* You probably will need to re-measure (i.e., call super.onMeasure() again here) 
    * if you need to get views X and Y to the left of view B or if 
    * if view B exceeds the previously-measured size... */ 
} 

И если нет, то вы можете использовать setOnLayoutChangeListener() на родителя и обратный вызов добиться того же.

+0

К сожалению, B не обязательно находится в центре родителя. Что наименее опасно из «косвенных» способов, которые вы предложили? –

+0

@ReinardusSuryaPradhitya Я добавил предложение к моему ответу, хотя мне жаль говорить, что он все еще довольно взломан. – Turix

+1

Извините, я забыл об этом вопросе. Я закончил делать, как вы сказали, но по какой-то другой причине сделать это в onMeasure не вариант. Я закончил регистрацию ViewTreeObserver.OnGlobalLayoutListener в представлении B и перестановку A на основе уже доступных измерений B. –

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