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,但它没有权重成员,所以它不好。

LinearLayout.LayoutParams是 的子类LinearLayout.MarginLayoutParams,如文档中所示。

这是不可能的吗?

不。

这不会是您只能在 XML 中执行的第一个 Android 布局任务

欢迎您提供此声明的证明。

就个人而言,我不知道任何只能通过 XML 而不能通过 SDK 中的 Java 方法完成的事情。事实上,根据定义,一切都必须通过 Java 实现(尽管不一定通过 SDK 可访问的方法),因为 XML 不是可执行代码。但是,如果您知道某些事情,请指出,因为这是 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 回答
24

由于设备屏幕像素密度的变化,最好始终使用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); 

希望这会有所帮助。

于 2014-06-09T13:16:57.310 回答
12

我已经使用下面的代码直接设置了边距

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,否则会出错。

于 2014-08-27T07:44:16.643 回答
8
 MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
 layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
于 2016-10-20T01:53:11.133 回答
7

试试这个

 LayoutParams params = new LayoutParams(
            LayoutParams.WRAP_CONTENT,      
            LayoutParams.WRAP_CONTENT
    );
    params.setMargins(left, top, right, bottom);
    yourbutton.setLayoutParams(params);
于 2013-10-07T09:35:01.200 回答
5

试试这个:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;
于 2017-04-26T04:26:54.650 回答
3
/*
 * invalid margin
 */
private void invalidMarginBottom() {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
    lp.setMargins(0, 0, 0, 0);
    frameLayoutContent.setLayoutParams(lp);
}

需要注意view的viewGroup的类型。比如上面的代码中,我想改变frameLayout的margin,而frameLayout的view group是RelativeLayout,所以需要转换成(RelativeLayout.LayoutParams)

于 2015-05-06T09:14:40.983 回答
0

这里单行解决方案:

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));
于 2017-04-19T11:00:23.027 回答
0

核心-KTX:


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

使用您在 ViewGroup 上的任何视图,而不是 RecycleView。


PS。Vel_daN:爱​​你所做的。

于 2021-07-28T13:55:02.377 回答