web-dev-qa-db-ja.com

LinearLayoutに余白をプログラムで設定する

私はJava( XML ではない)を使って、画面いっぱいに余白のあるボタンで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レイアウトタスクではないだろうから。

254
Timmmm

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

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);
478
Mauro

それでうまくいきますが、ボタンマージンをどのようにしてそれらの間にスペースができるのですか。

LinearLayout.LayoutParamsオブジェクトに対してsetMargins()を呼び出します。

私はLinearLayout.MarginLayoutParamsを使ってみましたが、それはウェイトメンバーを持っていないのでそれはダメです。

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

これは不可能ですか?

いいえ.

xMLでしかできない最初のAndroidレイアウトタスクではないでしょう

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

個人的には、私はXMLを介してのみ達成でき、SDKのJavaメソッドを介して達成できるものは何も知りません。実際、XMLは実行可能コードではないため、定義上、すべてがJava経由で実行可能である必要があります(必ずしもSDKにアクセス可能なメソッド経由ではありません)。しかし、何かを知っているのであれば指摘してください。これはSDKのバグであり、いつの日か修正されるはずです。

62
CommonsWare

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

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"チェックに注意してください。

30
Adam

デバイス画面のピクセル密度のばらつきのため、プログラム的にマージンを設定するために常にDIP unitを使用するのが良いでしょう。 below_のように

//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); 

これが役立つことを願っています。

21
Rupesh Yadav

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

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);

ここでの唯一のことは、パッケージAndroid.widget.RelativeLayout.LayoutParamsに従うためにLayoutParamsをインポートすべきであることに気づくことです、さもなければエラーがあるでしょう。

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

これを試して

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

これを試して:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;
3
Makvin
/*
 * invalid margin
 */
private void invalidMarginBottom() {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
    lp.setMargins(0, 0, 0, 0);
    frameLayoutContent.setLayoutParams(lp);
}

あなたはビューのviewGroupの型に注意するべきです。例えば、上のコードで、私はframeLayoutのマージンを変更したいです、そして、frameLayoutのビューグループはaですRelativeLayout、つまり(RelativeLayout.LayoutParams)に変換する必要があります

3
Francis Shi

ここで一行解決策:

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));
0
Stappo