Estoy tratando de crear una barra de pestañas en Android usando un RelativeLayout y un RadioGroup que tiene un indicador que se deslizará para indicar el RadioButton activo dentro del RadioGroup.RelativeLayout: alinea la vista al hijo del grupo de vista hermano
Estos son botones de radio personalizados que son efectivamente rectángulos con un ícono sobre texto, todos los contenidos centrados, que usa un selector de estado personalizado para el fondo.
Aquí es mi jerarquía actual:
<RelativeLayout> // Main view of the tab bar
<RadioGroup> // The buttons
<RadioButton />
<RadioButton />
<RadioButton />
</RadioGroup>
<ImageView /> // The indicator
</RelativeLayout>
La idea que tenía era cuando se hace clic en un botón de opción, me gustaría alinear el indicador a la & parte inferior parte superior del botón de opción seleccionado (y lo anime). Sin embargo, parece que layout_align<Edge>
solo funciona con elementos hermanos, no con miembros de otro grupo de vista, es decir, puedo alinearme con el RadioGroup mismo, pero no con un RadioButton dentro de él.
Pensé en poner el indicador como miembro del RadioGroup, pero como RadioGroup es una extensión de LinearLayout, no parece haber una manera de colocarlo en el borde de un RadioButton dado.
¿Alguien puede pensar en cómo podría resolver este problema? ¿O tal vez hay una solución mejor que mi técnica de alineación animada al botón?
ACTUALIZACIÓN Con la ayuda de @superjos, logré resolver esto bastante bien.
Tuve que dar a cada botón una altura conocida en lugar de usar wrap_content
(no es ideal, pero para este proyecto probablemente debería funcionar bien). Haga que la altura del indicador coincida con la de los botones. Asegúrese de que RadioGroup esté configurado para ajustar el contenido y centrado verticalmente en la vista principal. Establezca el indicador en alignTop
y toRightOf
RadioGroup. A continuación, haga clic en el botón para el oyente:
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();
}
genial! ¡y la implementación también se ve bien! – superjos