RelativeLayout: выровнять представление по дочернему элементу родственной группы просмотра

Я пытаюсь создать панель вкладок в Android, используя RelativeLayout и RadioGroup, у которых есть индикатор, который будет скользить, чтобы указать активный RadioButton в RadioGroup.

Это настраиваемые переключатели, которые по сути представляют собой прямоугольники со значком над текстом, все содержимое выровнено по центру, в котором используется настраиваемый селектор состояния для фона.

Вот моя текущая иерархия:

<RelativeLayout>       // Main view of the tab bar
  <RadioGroup>         // The buttons
    <RadioButton />
    <RadioButton />
    <RadioButton />
  </RadioGroup>
  <ImageView />        // The indicator
</RelativeLayout>

Моя идея заключалась в том, что при щелчке по переключателю я выравнивал индикатор по верхнему и нижнему краям выбранного переключателя (и анимировал его). Однако кажется, что layout_align работает только с одноуровневыми элементами, а не с членами другой группы просмотра, т.е. я могу выравниваться по самой RadioGroup, но не по RadioButton внутри нее.

Я думал поместить индикатор как член RadioGroup, но поскольку RadioGroup является расширением LinearLayout, похоже, нет способа разместить его на краю данного RadioButton.

Кто-нибудь может придумать, как я могу решить эту проблему? Или, может быть, есть лучшее решение, чем моя техника выравнивания анимации по кнопке?

UPDATE С помощью @superjos мне удалось довольно хорошо решить эту проблему.

Мне пришлось задать каждой кнопке известную высоту вместо использования wrap_content (не идеально, но для этого проекта, вероятно, должно работать нормально). Высота индикатора должна соответствовать высоте кнопок. Убедитесь, что RadioGroup настроено на перенос содержимого и центрирование по вертикали в родительском представлении. Установите индикатор на alignTop и наRightOf RadioGroup. Затем для прослушивателя нажатия кнопки:

int prevY, newY;
int prevButtonIndex, newButtonIndex;

public void moveIndicator(button, indicator, index) {
  prevY = newY;
  newY = prevY + (index - prevButtonIndex) * button.getHeight();
  TranslateAnimation animation = new TranslateAnimation(0, 0, prevY, newY);
  animation.setDuration(500);
  animation.setFillAfter(true); // stay at final animation position
  indicator.setAnimation();
  animation.start();
}
6
задан Josh Kovach 8 December 2011 в 16:11
поделиться