282

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 レイアウト タスクではないからです。

4

11 に答える 11

517

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

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);
于 2010-06-09T00:22:18.300 に答える
63

それでうまくいきますが、ボタンの間にスペースを空けるために、ボタンにマージンを与えるにはどうすればよいでしょうか。

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

LinearLayout.MarginLayoutParams を使ってみたのですが、それは weight メンバがないのでダメです。

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

これは不可能ですか?

いいえ。

XML でのみ実行できる最初の Android レイアウト タスクではありません。

この主張の証拠を提供していただければ幸いです。

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

于 2010-03-20T01:22:44.870 に答える
32

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

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

于 2013-05-09T11:23:58.327 に答える
3
/*
 * invalid margin
 */
private void invalidMarginBottom() {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
    lp.setMargins(0, 0, 0, 0);
    frameLayoutContent.setLayoutParams(lp);
}

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

于 2015-05-06T09:14:40.983 に答える
0

コア-KTX:


 updateLayoutParams<RecyclerView.LayoutParams> {
                topMargin = 10
                rightMargin = 10
                bottomMargin = 10
                leftMargin = resources.getDimensionPixelSize(R.dimen.left)
            }

RecycleView の代わりに、ViewGroup のビューを使用します。


PS。Vel_daN: あなたがすることが大好きです。

于 2021-07-28T13:55:02.377 に答える