2010-03-20 122 views
221

我正尝试使用Java(而不是XML)创建带有填充屏幕并具有页边距的按钮的LinearLayout。下面是代码,没有利润的工作:以编程方式在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

http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html#setMargins(int,INT,INT,INT)代替layoutParams.setMargins(30, 20,30,0);你把layoutParams.setMargins(30dp,20dp,30dp,0dp); – DarthestVader 2012-01-09 17:40:30

+3

setMargins以int作为参数..您只能使用xml attributtes – jyavenard 2012-02-01 08:05:56

回答

432

这里是一个小的代码来完成它:

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

它也可能为代码中的小部件提供边距。 – 2010-07-13 11:45:31

+6

感谢您提供点对点代码示例 - 比描述更有益 – 2011-05-24 19:08:03

+24

看起来边缘参数设置为像素。任何方式来设置他们在DPS? – 2011-07-14 22:40:45

62

使作品很好,但如何在地球上 你给按键边距,以便 它们之间存在的空间吗?

你叫setMargins()LinearLayout.LayoutParams对象。

我试着用 LinearLayout.MarginLayoutParams,但 不具有配重部件,因此没有 好。

LinearLayout.LayoutParamsLinearLayout.MarginLayoutParams一个子类,如documentation指示。

这是不可能的吗?

它不会是第一款Android 布局任务中,你只能在XML

做欢迎您提供这种说法的证据。

就我个人而言,我不知道任何只能通过XML而不能通过SDK中的Java方法完成的任何事情。事实上,根据定义,所有事情都必须通过Java来实现(尽管不一定通过SDK可达方法),因为XML不是可执行代码。但是,如果您了解某些事情,请指出,因为这是SDK中的一个错误,应该有一天会得到修复。

+2

提供“dp”哈,好吧我现在明白了。在这个相当复杂的布局系统中有点迷失。我不认为有什么可以在运行时设置layout_widgth/height。 – Timmmm 2010-03-20 10:51:52

+2

而且没有办法设置样式:http://stackoverflow.com/questions/2016249/how-to-programmatically-setting-style-attribute-in-a-view – Timmmm 2010-03-20 11:04:40

+1

我没有设置宽度的问题和通过'LayoutPararms'在运行时的高度。我的风格的条款...是的,好吧,有一个原因,我不使用他们。 :-) – CommonsWare 2010-03-20 11:42:19

28

要直接增加利润的项目(部分项目利润率允许直接编辑),你可以这样做:

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 2014-07-24 21:04:23

+2

比最投票/接受的答案更准确和适用... – Rick 2016-11-11 18:22:09

7

试试这个

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

这对我不起作用。 – Nik 2014-08-22 15:06:12

19

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

希望这会有所帮助。

8

我已经设置了利润率直接使用下面的代码

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

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

你应该洁具视图的viewGroup.In的上述代码的类型,例如,我想改变的FrameLayout的保证金,以及FrameLayout里的视图组是RelativeLayout的,所以你需要隐蔽到(RelativeLayout.LayoutParams)

5
MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams(); 
layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin); 
+2

“尽管此代码可能回答此问题,但最好在此处包含对代码的解释。 – xenteros 2016-10-20 06:29:16

0

这里一行解决方案:

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

试试这个:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams(); 
params.width = 250; 
params.leftMargin = 50; 
params.topMargin = 50; 
相关问题