以编程方式在LinearLayout中设置边距

我正在尝试使用Java( 而不是XML )来创build一个带有填充屏幕的button的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); 

所以,这工作得很好,但你怎么给button边缘,所以他们之间有空间? 我尝试使用LinearLayout.MarginLayoutParams ,但没有weight成员,所以这是不好的。 如果你在它的构造函数中传递lp ,它也不起作用。

这是不可能的吗? 因为它看起来确实如此,并且它不会是您只能在XML中执行的第一个Android布局任务。

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

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

所以,这工作得很好,但你怎么给button边缘,所以他们之间有空间?

您可以在LinearLayout.LayoutParams对象上调用setMargins()

我尝试使用LinearLayout.MarginLayoutParams,但没有权重成员,所以这是不好的。

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

这是不可能的吗?

没有。

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

欢迎您提供此声明的certificate。

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

要将边距直接添加到项目(某些项目允许直接编辑边距),可以执行以下操作:

 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”检查,如果您尝试运行此对不支持页边距的东西。

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

希望这会有所帮助。

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

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

尝试这个

  LayoutParams params = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT ); params.setMargins(left, top, right, bottom); yourbutton.setLayoutParams(params); 
  MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams(); layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin); 
 /* * invalid margin */ private void invalidMarginBottom() { RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams(); lp.setMargins(0, 0, 0, 0); frameLayoutContent.setLayoutParams(lp); } 

你应该是视图的viewGrouptypes的ware。在上面的代码中,例如,我想改变frameLayout的边距,而frameLayout的视图组是一个RelativeLayout ,所以你需要转化为(RelativeLayout.LayoutParams)

尝试这个:

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

这里单行解决scheme:

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