0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LinearLayoutで子ビューが中央に来ない? setGravity と layoutParams.gravity の違い

Last updated at Posted at 2025-05-28

はじめに

javaのコードでレイアウトをするときに、LinearLayoutを使って
親要素の中で子のリニアレイアウトを上下中央配置にしたかった時に試した備忘録。
setGravityとGravityって何が違うの?

結論、setGravity(Gravity.CENTER)を親のLinearLayoutに付与すれば子のLinearLayoutは上下中央配置になる。

 parent.setGravity(Gravity.CENTER);

setGravity と layoutParams.gravity

GPTさんに聞いてみた

書き方 対象 効果
setGravity(Gravity.CENTER) 親ViewGroup 親の中で 子要素の配置位置 を決める
layoutParams.gravity = Gravity.CENTER 子View 子が 親の中でどこに配置されたいか を伝える

さすが。
setGravityは 「親がここにいなさい!」と命令するのに対し
layoutParams.gravityは 「子が親にここに居たい!」とお願いするイメージっぽい
ただし、LinearLayoutの時、後者の子から親にお願いするおねだりは却下されるっぽい。(うまく配置されない)

具体例

親にsetGravity(Gravity.CENTER)を付与した時


// 親ビュー
        LinearLayout parent = new LinearLayout(this);
        LinearLayout.LayoutParams parentParam = new LinearLayout.LayoutParams(1000,500);
        parent.setGravity(Gravity.CENTER); // ← ここ注目。
        parent.setBackgroundColor(Color.GRAY);
        addContentView(parent, parentParam);
// 子ビュー
        LinearLayout child = new LinearLayout(this);
        LinearLayout.LayoutParams childParam = new LinearLayout.LayoutParams(500,250);
        child.setBackgroundColor(Color.WHITE);
        parent.addView(child, childParam);

image.png

親ビューの中で子ビューが上下中央配置される。 問題なし。

子にlayoutParams.gravity = Gravity.CENTERを付与したとき
※(間違った方法)

// 親ビュー
        LinearLayout parent = new LinearLayout(this);
        LinearLayout.LayoutParams parentParam = new LinearLayout.LayoutParams(1000,500);
        // parent.setGravity(Gravity.CENTER); ここで指定せず
        parent.setBackgroundColor(Color.GRAY);
        addContentView(parent, parentParam);
// 子ビュー
        LinearLayout child = new LinearLayout(this);
        LinearLayout.LayoutParams childParam = new LinearLayout.LayoutParams(500,250);
        childParam.gravity = Gravity.CENTER; // ←ここ追加。
        child.setBackgroundColor(Color.WHITE);
        parent.addView(child, childParam);

image.png

左寄りの上下中央になる。(なんでそうなるのか詳しくはわからない。。)

親が LinearLayout の場合、子にgravityをつけても効きません!とのことらしい。
LinearLayout の配置は、主に 親側の setGravity() でコントロールするとのこと。

子→親で上下中央配置にしたいときは?

FrameLayout.LayoutParams なら有効らしい。

// 親ビュー
        FrameLayout parent = new FrameLayout(this); // ← ここをFrameLayout
        FrameLayout.LayoutParams parentParam = new FrameLayout.LayoutParams(1000,500);// ← ここをFrameLayout
        parent.setBackgroundColor(Color.GRAY);
        addContentView(parent, parentParam);
// 子ビュー
        LinearLayout child = new LinearLayout(this);
        FrameLayout.LayoutParams childParam = new FrameLayout.LayoutParams(500, 250);//← ここをFrameLayout
        childParam.gravity = Gravity.CENTER;
        child.setBackgroundColor(Color.WHITE);
        parent.addView(child, childParam);

image.png

うまくいってる。

まとめ

  • LinearLayoutの場合、子にlayoutParams.gravity を使っても親内で上下中央配置にはできない
  • LinearLayoutの場合、子を親内で上下中央配置したい場合、親でsetGravityをする必要がある。
  • 子→親で上下中央配置したい場合はFrameLayoutを利用するとうまくいく。

今回は中央寄せでしたが、STARTとかENDとかCENTER_HORIZONTALとかもうまくいく方法ではうまくいく。
以上、備忘録でした。

※てかFrameLayoutって何という新たな疑問がうまれたので後ほど勉強。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?