То, что вы на правильном пути, но вы должны также добавить правило для горизонтального центрирования: 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()
на родителя и обратный вызов добиться того же.
К сожалению, B не обязательно находится в центре родителя. Что наименее опасно из «косвенных» способов, которые вы предложили? –
@ReinardusSuryaPradhitya Я добавил предложение к моему ответу, хотя мне жаль говорить, что он все еще довольно взломан. – Turix
Извините, я забыл об этом вопросе. Я закончил делать, как вы сказали, но по какой-то другой причине сделать это в onMeasure не вариант. Я закончил регистрацию ViewTreeObserver.OnGlobalLayoutListener в представлении B и перестановку A на основе уже доступных измерений B. –