私は、RelativeLayoutとRadioGroup内のアクティブなRadioButtonを示すためにスライドするインジケーターを持つRadioGroupを使用して、Androidでタブバーを作成しようとしています。
これらはカスタマイズされたラジオボタンであり、テキストの上にアイコンが付いた長方形で、すべてのコンテンツが中央に配置され、背景にカスタムの状態セレクターが使用されます。
これが私の現在の階層です:
<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
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();
}