RelativeLayoutとRadioGroupを使ってアンドロイドでタブバーを作成しようとしています.RadiaGroup内のアクティブなRadioButtonを示すインジケータが表示されます。RelativeLayout:兄弟ビューグループの子にビューを揃える
カスタマイズされたラジオボタンは、効果的な矩形であり、すべてのコンテンツが中央に配置され、背景に対してカスタムの状態セレクタを使用するテキスト上のアイコンを備えています。ここで
は私の現在の階層です:
<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
の代わりに既知の高さを与えなければなりませんでした(理想的ではありませんが、このプロジェクトではうまくいくはずです)。インジケータの高さをボタンの高さに合わせます。ラジオグループがコンテンツをラップするように設定され、親ビューに垂直に中央揃えされていることを確認します。インジケータを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();
}
素晴らしい!実装も良好に見えます! – superjos