LinearLayoutの子の間にスペースを作る方法は?


160

プログラムで垂直方向のLinearLayoutにカスタムビューを追加していますが、ビュー間にスペースを確保したいと考えています。私はCustomViewコンストラクターにsetPadding(0、1、0、1)を追加しようとしましたが、これは効果がないようです。何かアドバイス?

※余白は必要だと指摘されました。私は動的にビューを追加しているので、(xmlではなく)コードからマージンを設定する必要があります。これを行う方法は次のとおりだと思いますが、機能していません。

public class MyView extends View
{
    public MyView (Context context)
    {
        super(context);

        MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT,  LayoutParams.WRAP_CONTENT);
        params.setMargins(0, 10, 0, 10);
        setLayoutParams(params);

*編集。ビューを線形レイアウトに追加する際に、MarginLayoutParamsをパラメーターとして使用してみました(以下を参照)。これも機能しませんでした:

MarginLayoutParams params = new MarginLayoutParams(linearLayout.getLayoutParams());
linearLayout.setMargins(0, 10, 0, 10);
linearLayout.addView(view, params);

ビューを追加するXMLファイルを追加すると役立つ場合があります。
Dennis Winter

回答:


131

あなたはandroid:layout_margin<Side>子供たちにすべきです。パディングは内部です。


目的のマージンを使用してビューをXMLで定義し、定義済みのビューを手順で追加して、Javaコードのコンテンツも適用できます。
Mike Yockey、2011年

これが何を意味するのかよくわかりません。customviewをxmlで定義する必要がありますか?しかし、任意の数のカスタムビューを動的に作成する必要があります。それを線形レイアウトに追加します。
ab11

2
MarginLayoutParamsではなくLayoutParamsを使用してみてください。
トーマス

1
LinearLayout.LayoutParamsで設定する属性は何ですか?そのクラスには、「マージン」や「パディング」などのようなものはありませんか?
ab11 2010年

@Thomas「パディングは内部的」とはどういう意味ですか。各コンポーネントにマージンを適用する必要があります。これは、コードの重複を最小限に抑えるために回避しようとしているものです(子コンポーネント間に使用する間隔が等しいため)
OmGanesh

188

API> = 11解決策:

パディングをディバイダーに統合できます。何も使用していない場合は、空のドローアブルを作成し、それをLinearLayoutのディバイダーとして設定します。

    <LinearLayout
            android:showDividers="middle"
            android:divider="@drawable/empty_tall_divider"
...>...</LinearLayout>

empty_tall_divider.xml:

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size
            android:height="40dp"
            android:width="0dp"/>
</shape>

:あなたがLinearLayoutCompat使用する場合は、API <11でそれを使用することができますdeveloper.android.com/reference/android/support/v7/widget/...
Androidデベロッパー

5
正方形のような形状を作成すると、幅を持つ新しいものを作成する必要なく、垂直および水平のLinearLayoutsで使用できます。
WarrenFaith 2015


1
これは、ビューのセットがあり、それらのいくつかを有効にする場合にはるかに優れていますGONE。指定するandroid:showDividers="middle"と、実際に必要なスペースのみが取得されます。
DariusL

@DariusL d.android.comでこのshowDividers属性が見つかりません。これを使用してもよろしいですか?
ヘンリー

35

Androidは、ビュー間にスペースビューを追加できるようになりました。4.0 ICS以降で使用できます。


12
どうやらAndroidの-妖精はあなたに耳を傾け、API 14 :)(で「スペース」ビューを作成しdeveloper.android.com/reference/android/widget/Space.html
shaylh

笑!それは時間の問題でした。
勤務

8
ただし、ビューごとにスペースを空ける必要があります。これは、すべてのビューにギャップを宣言することとは異なります。
レイ・ゴンサレス

^非常にそうです。ただし、LinearLayoutを使用している場合は、各子ビューに適用されるディバイダーを追加できます。ここを参照してください:developer.android.com/reference/android/widget/...
働いていた

1
これは答えではありません。
Stealth Rabbi

24

以下のサンプルは、プログラムで必要なことを行うだけです。(140,398)の固定サイズを使用しました。

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(140, 398);
        layoutParams.setMargins(24, 0, 24, 0);
        layout.addView(button,layoutParams);

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(140、398);以下のようなもう1つの追加の手順でそれを行っていました。layoutParams.setMargins(24、0、24、0); そして、button1.setLayoutParams(layoutParams); layout.addView(button、layoutParams); .. addviewは2つの引数をとることができることを知ってくれてありがとう。
png

6

APIレベル14以降、(透明な)ディバイダードローアブルを追加できます。

android:divider="@drawable/divider"
android:showDividers="middle"

残りはあなたのために処理します!


1
最初にドローアブルの仕切りを指定する必要がありますか、それとも他に何も使用せずに使用できますか?
Tim Kist、2016

8dpこれはどこから来たの?
Yousha Aleayoub 2016

1
@TimKistあなたは私が思うに他に何もせずにそれを使うことができます
teh.fonsi 2017年

android:dividerPaddingは線形レイアウトの子の間の距離に影響を与えないため、この答えは正しくありません。子に面していないディバイダーの側面にパディングを適用します(たとえば、垂直のLinearLayoutのディバイダーの左右のパディング)。Androidのドキュメント:developer.android.com/reference/android/widget/...
leorleor

2
@leorleorあなたは正しいです。最善の方法は、おそらく透明なディバイダードローアブルを使用することです。私はそれに応じて私の答えを更新しました。
teh.fonsi 2017

4

LinearLayout.LayoutParams代わりに使用しますMarginLayoutParamsここにドキュメントがあります。


LinearLayout.LayoutParamsで設定する属性は何ですか?そのクラスには、「マージン」や「パディング」などのようなものはありませんか?
ab11

LinearLayout.LayoutParams拡張しMarginLayoutParamssetMargins()上記で使用していたものと同じメソッドを継承します...
Chris Fei

ああ、ありがとう!私が見ていました:android.view.ViewGroup.LayoutParams
ab11

3

ActionBarSherlockを使用する場合は、com.actionbarsherlock.internal.widget.IcsLinearLayoutを使用できます。

<com.actionbarsherlock.internal.widget.IcsLinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:divider="@drawable/list_view_divider"
        android:dividerPadding="2dp"
        android:showDividers="middle" >
...
</com.actionbarsherlock.internal.widget.IcsLinearLayout>

2

子ビューのレイアウトでパディングを使用します。

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_margin="5dp"
          android:background="@drawable/backage_text"
          android:textColor="#999999"
           >

</TextView>

backage_text.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="@color/white"/>
    <corners android:radius="2dp"/>
    <stroke
        android:width="1dp"
        android:color="#999999"/>
    <padding
        android:bottom="5dp"
        android:left="10dp"
        android:right="10dp"
        android:top="5dp" />
</shape>

0

次のようにしてLayoutParams、親のLinearLayoutを取得し、個々のビューに適用できます。

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • setMargins()はintデータ型としてピクセルを取ることに注意してください。値を追加する前にdpに変換してください
  • 上記のコードは高さと幅をwrap_contentに設定します。カスタマイズできます。

0

次のようにビューを追加した後、スペースウィジェットを追加してみてください。

layout.addView(view)
val space = Space(context)
space.minimumHeight = spaceInterval
layout.addView(space)

0

動的に行う簡単な方法は、子にパディングを追加することです。追加するオブジェクトで.setPadding()を使用して設定できます。この例では、LinearLayoutにImageViewを追加しています。

LinearLayout userFeedLinearLayout = (LinearLayout) findViewById(R.id.userFeedLinearLayout);
imageView.setImageBitmap(bitmap);
imageView.setPadding(0, 30, 0, 30);
userFeedLinearLayout.addView(imageView);

次の画像は、パディングで追加された2つのImageViewを示しています。

子供のパディング


-1

レイアウトにラベルが含まれている場合oテキスト用のコンテナ。各テキストの末尾に「\ n」を追加して、行を分割し、要素間にスペースを作ることができます。
例:

video?.text="Video NR1: ${obj.Titulo} \n" 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.