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を追加せざるを得ないのがすっきりしない。
もっとスマートな方法はないものか。