Я пытаюсь создать панель вкладок в 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();
}