web-dev-qa-db-ja.com

LinearLayout、RelativeLayoutなどのマージンが期待どおりに機能しない

グループレイアウトのマージンが機能していないようです。

例えば、

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_margin="40dip"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Button
        Android:id="@+id/button"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:text="I'm a button" />

</LinearLayout>

すべての辺に40pのマージンを持つボタンを表示する必要があります。ただし、右と下に80pのマージンがあります。

私は何か間違ったことをしていますか?これはバグですか?

回避策は重力を使用することですが、これはマージンでのみ機能します。

ところで、同様の質問 ここに投稿 がありますが、回答されていません。

23
Matt

Android:padding="40dp" on the LinearLayoutまたはAndroid:layout_margin="40dp"ボタンを押すと、必要な効果が得られます。パディングはビューの端とそのコンテンツの間のスペースを定義し、レイアウトマージンはビューの側面の余分なスペースを定義します。

25
Robby Pond

問題は実際にはFrameLayoutがマージンを解釈する方法です。 setContentView()は、「メイン」レイアウトをFrameLayoutにアタッチします。これは、ビュー階層の実際のルート(階層ビューアで確認できます)であり、電話で提供されます。

マージンは親レイアウトによって管理されるため、この場合はメインFrameLayoutです。機能なのかバグなのかはわかりませんが、それがこのレイアウトがマージンを解釈する方法です。

さて、私が入力している間に解決策が既に投稿されていました:代わりにパディングを使用してください。

13
bigstones

レイアウトにマージンを設定する必要がある場合は、単にそれを別の線形または相対レイアウトでラップします

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent">

  <LinearLayout Android:layout_margin="40dip"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Button Android:id="@+id/button"
      Android:layout_width="match_parent"
      Android:layout_height="match_parent"
      Android:text="I'm a button" />

  </LinearLayout>

</LinearLayout>
6
yorkw

リニアレイアウトを別のレイアウトでラップすることが最善の方法です。

0
Pratha