FrameLayoutでViewを指定位置に配置する

AndroidのViewを指定位置(ActivityやViewGroup内の指定座標)に配置したい。そんな時は、FrameLayoutを使うと直感的な座標設定で実現できます。

FrameLayoutは、View同志の「重なり」の影響を受けずに、「gravity」と「margin」でViewを配置できるレイアウトです。gravityには、配置の基準位置(上端、下端、左端、右端)を、marginには基準位置からの距離を設定します。この組み合わせで

FrameLayoutの右上端から左に10ピクセル、下に5ピクセルの位置にTextViewを配置

といったことができるようになるわけです。Androidアプリ内の絶対位置で配置する場合は、Activity全体にsetContentView()でFrameLayoutを配置して、そのFrameLayout内部でgravityとmarginを設定する形になります。

具体的には、以下のサンプルコードのような設定になるでしょう。

FrameLayout l = new FrameLayout(this);

FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(width, height);

lp.gravity = 基準位置;

lp.topMargin = 上margin;
lp.bottomMargin = 下margin;
lp.leftMargin = 左margin;
lp.rightMargin = 右margin;

l.addView(view, lp);

もちろんJavaのコードではなくxmlでFrameLayoutを作成することもできます。

他のViewの影響を受けずに指定座標に直接配置できるFrameLayoutは、「コンテンツを表示するView内部に操作用のパネルを配置したい」といった場合には便利です。ただ、複雑なレイアウトを実現しようとするとかなり面倒な座標計算が必要になりますし、保守性も低下するでしょう。使うべき場面を選ぶ必要がありますね。