Я пытаюсь создать панель вкладок в 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<Edge>
работает только с элементами одного уровня, а не с членами другой группы представлений, то есть я могу выровнять с самой RadioGroup, но не с RadioButton внутри нее.
Я думал поместитьиндикатор как член RadioGroup, но так как RadioGroup является расширением LinearLayout, похоже, нет способа разместить его на границе данного RadioButton.
Может кто-нибудь подумать, как я мог бырешить эту проблему?Или, может быть, есть лучшее решение, чем мой метод анимации с выравниванием по кнопке?
ОБНОВЛЕНИЕ С помощью @superjos мне удалось решить эту проблему довольно хорошо.
Мне пришлось дать каждой кнопке известную высоту вместо использования wrap_content
(не идеально, но для этого проекта это, вероятно, должно работать нормально).Сделайте так, чтобы высота индикатора соответствовала высоте кнопок.Убедитесь, что RadioGroup настроена для переноса содержимого и центрирования по вертикали в родительском представлении.Установите индикатор на alignTop
и toRightOf
Радиогруппы.Затем для кнопки прослушивания нажмите:
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();
}