HorizontalScrollViewの子Viewを右詰めにする
HorizontalScrollViewは水平方向にスクロールを行うためのコンテナViewだ。
子のViewの幅の合計が自らの規定幅を超えた場合に、水平方向のスクロールガイドを表示する。
このHorizontalScrollView、便利なのだがちょっと困ったことがある。
- HorizontalTest.java
public class HorizontalTest extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); HorizontalScrollView hsv = new HorizontalScrollView(this); LinearLayout l1 = new LinearLayout(this); l1.setBackgroundColor(Color.RED); for ( int i = 0; i < 2; i++) { Button btn = new Button(this); btn.setText(String.valueOf(i+1)); l1.addView(btn, new LayoutParams(80, LayoutParams.WRAP_CONTENT)); } hsv.addView(l1); this.setContentView(hsv, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); } } //コンテナとなるLinearLayout(l1)の位置とサイズが分かりやすいように、背景に色をつけている。
- 実行結果
上のソースコードに限定したことではなく、Buttonを追加していくとこのイメージの様に必ず左詰めで追加されるのだ。右詰で追加していきたいのだが、その方法が無い。
これはHorizontalScrollViewの親クラスがFrameLayoutであり、setGravityメソッドを持たないからだろう。(ちなみにHorizontalScrollViewにはsetForegroundGravityメソッドがあるが、これはView上に描画するDrawable等のGravity(重力)を指定するものであり、LinearLayout等と同じようには使えない)
結局、LinearLayoutをルートに追加して、これをHorizontalScrollView含めた全てのコンテナとして使い、その上でsetGravity(Gravity.RIGHT)を指定することでようやく上手くいった。
- HorizontalTest.java (改)
public class HorizontalTest extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout l0 = new LinearLayout(this); l0.setBackgroundColor(Color.RED); l0.setGravity(Gravity.RIGHT); HorizontalScrollView hsv = new HorizontalScrollView(this); LinearLayout l1 = new LinearLayout(this); l1.setBackgroundColor(Color.RED); for ( int i = 0; i < 2; i++) { Button btn = new Button(this); btn.setText(String.valueOf(i+1)); l1.addView(btn, new LayoutParams(80, LayoutParams.WRAP_CONTENT)); } hsv.addView(l1, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); l0.addView(hsv); setContentView(l0, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); } }
- 実行結果
目的は果たせたものの、必要の無いViewを追加せざるを得ないのがすっきりしない。
もっとスマートな方法はないものか。