プログラムでLinearLayoutにマージンを設定する


266

私は(XMLではなく)Javaを使用して、画面いっぱいに余白のあるボタンを備えたLinearLayoutを作成しようとしています。以下は、マージンなしで機能するコードです。

LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
    Button btn = new Button(this);
    btn.setText("A");

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
    lp.weight = 1.0f; // This is critical. Doesn't work without it.
    buttonsView.addView(btn, lp);
}

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);

だからそれはうまくいきますが、ボタンの間にスペースがあるようにボタンのマージンをどのように与えますか?を使ってみましLinearLayout.MarginLayoutParamsたが、weightメンバーがいないのでダメです。またlp、コンストラクタで渡した場合も機能しません。

これは不可能ですか?見た目は確かであり、XMLでしか実行できない最初のAndroidレイアウトタスクではないからです。


1
developer.android.com/reference/android/view/…、int、int、int)layoutParams.setMargins(30、20、30、0);の代わりに あなたはlayoutParams.setMargins(30dp、20dp、30dp、0dp);
DarthestVader

3
setMarginsはintを引数として受け取ります。.xml属性を使用して「dp」のみを提供できます
jyavenard

回答:


496

これを実現するための小さなコードを次に示します。

LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

layoutParams.setMargins(30, 20, 30, 0);

Button okButton=new Button(this);
okButton.setText("some text");
ll.addView(okButton, layoutParams);

6
ポイント・トゥ・ザ・ポイントのコードサンプルへの感謝-単なる説明よりもはるかに有益
Someone Somewhere

25
マージンパラメータがピクセル単位で設定されているようです。dpsでそれらを設定する方法はありますか?
Artem Russakovskii

30
@ArtemRussakovskii Androidのほとんどの関数と同様に、ピクセルを使用します。ディップをpxに変換するグローバルユーティリティ関数をお勧めします。これは私がすべてのアプリで行ったことです。Android APIは最低です。
mxcl 2012年

7
@MaxHowellそれが私がやったことです。そのような基本的なものが欠けていることは驚くべきことです。
Artem Russakovskii 2012年

5
@ArtemRussakovskii-TypedValue.applyDimension(...)を使用してDIPをPXに変換します。stackoverflow.com/questions/2238883/…を
ゴータム2013

64

だからそれはうまくいきますが、ボタンの間にスペースがあるようにボタンのマージンをどのように与えますか?

あなたは呼んsetMargins()LinearLayout.LayoutParamsオブジェクト。

LinearLayout.MarginLayoutParamsを使用してみましたが、これには重みメンバーがないため、良くありません。

LinearLayout.LayoutParamsドキュメントにLinearLayout.MarginLayoutParams示されているように、のサブクラスです。

これは不可能ですか?

番号。

これは、XMLでしか実行できない最初のAndroidレイアウトタスクではありません。

あなたはこの主張の証拠を提供することを歓迎します。

個人的には、SDKのJavaメソッドを介してではなく、XMLを介してのみ達成できることは何も知りません。実際、XMLは実行可能なコードではないため、定義上、すべてがJavaを介して実行可能である必要があります(SDKに到達可能なメソッドを介して実行できるとは限りません)。ただし、何か気づいた場合は指摘してください。これはSDKのバグであり、いつか修正される予定です。


2
ハ、わかりました。わかりました。かなり複雑なレイアウトシステムで少し迷っていました。とにかく、実行時にlayout_widgth / heightを設定する方法はないと思います。
Timmmm

2
そして、スタイルを設定する方法はありません。stackoverflow.com/questions/2016249/...
Timmmm

1
実行時の幅と高さの設定に問題はありませんでしたLayoutPararms。私はスタイルの条件を言っています...ええ、まあ、私がそれらを使用しない理由があります。:-)
CommonsWare 2010年

6
プログラムでUIを生成するのがなぜPITAなのかを知りたい
Someone Somewhere

3
何日か前に私が認識できるように年齢を重ねました。数日前に、マージンをサポートしていない間違ったLayoutParamsをインポートしました...これらの回答を読んで、インポートを削除することにしました。10を超えるオプションがありますD:linearLayout.LayoutParamsを選びました。動作します。
Doomsknight

31

アイテムに直接マージンを追加するには(一部のアイテムではマージンを直接編集できます)、次の操作を実行できます。

LayoutParams lp = ((ViewGroup) something).getLayoutParams();
if( lp instanceof MarginLayoutParams )
{
    ((MarginLayoutParams) lp).topMargin = ...;
    ((MarginLayoutParams) lp).leftMargin = ...;
    //... etc
}
else
    Log.e("MyApp", "Attempted to set the margins on a class that doesn't support margins: "+something.getClass().getName() );

...これは、周囲のレイアウトを知る/編集する必要なく機能します。マージンをサポートしていないものに対してこれを実行しようとした場合の「instanceof」チェックに注意してください。


2
そのまさに私が探しています。
djdance 14

21

デバイス画面のピクセル密度のばらつきにより、常にDIPユニットを使用してプログラムでマージンを設定することをお勧めします。以下のように_

//get resources
Resources r = getResources();
float pxLeftMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxTopMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxRightMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxBottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());

//get layout params...
LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
params.setMargins(Math.round(pxLeftMargin), Math.round(pxTopMargin), Math.round(pxRightMargin), Math.round(pxBottomMargin));

//set margin...
yourLayoutTOsetMargin.setLayoutParams(params); 

これがお役に立てば幸いです。


10

以下のコードを使用してマージンを直接設定しました

LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);            
params.setMargins(3, 300, 3, 3); 
layout.setLayoutParams(params);

ここでの唯一のことはLayoutParams、以下のパッケージandroid.widget.RelativeLayout.LayoutParamsにインポートする必要があることを確認することです。そうしないと、エラーが発生します。


7

これを試して

 LayoutParams params = new LayoutParams(
            LayoutParams.WRAP_CONTENT,      
            LayoutParams.WRAP_CONTENT
    );
    params.setMargins(left, top, right, bottom);
    yourbutton.setLayoutParams(params);

7
 MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
 layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);

2
「このコードは質問に答える可能性がありますが、コードの説明をここに含めることをお勧めします。
xenteros 2016年

4

これを試して:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;

3
/*
 * invalid margin
 */
private void invalidMarginBottom() {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
    lp.setMargins(0, 0, 0, 0);
    frameLayoutContent.setLayoutParams(lp);
}

上記のコードでは、たとえば、frameLayoutのマージンを変更し、frameLayoutのビューグループはRelativeLayoutであるため、(RelativeLayout.LayoutParams)に変換する必要があります。


0

ここで単一行のソリューション:

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.