以编程方式向RelativeLayout添加边距。 我做错了什么?

我试图在我的活动中以编程方式添加边距到我的RelativeLayout 。 使用xml我可以在这种模式下执行: android:layout_marginTop="10dp" ,但是当我试图做它programatically没有改变…正如你可以看到我使用一些RelativeLayout (有一个for循环)在一个LinearLayout容器中…

这是我正在使用的代码:

  //LINEAR LAYOUT LinearLayout linearLayout = new LinearLayout(this); linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); for (int i=1; i<=3; i++){ //RELATIVE LAYOUT RelativeLayout relativeLayout = new RelativeLayout(this); relativeLayout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT)); relativeLayout.setBackgroundColor(getResources().getColor(R.color.grayColor)); //CODE FOR ADD MARGINS RelativeLayout.LayoutParams relativeParams = (RelativeLayout.LayoutParams)relativeLayout.getLayoutParams(); relativeParams.topMargin=80; relativeLayout.setLayoutParams(relativeParams); //IMAGE VIEW ImageView selectedPhoto = new ImageView(this); selectedPhoto.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); selectedPhoto.setImageResource(R.drawable.ic_launcher); //TEXT VIEWS TextView numberCopies = new TextView(this); numberCopies.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); numberCopies.setGravity(Gravity.CENTER); numberCopies.setPadding(25, 25, 25, 25); numberCopies.setTextColor(getResources().getColor(R.color.blackColor)); numberCopies.setText("2 copies "); RelativeLayout.LayoutParams layoutParamsNumberCopies = (RelativeLayout.LayoutParams) numberCopies.getLayoutParams(); layoutParamsNumberCopies.addRule(RelativeLayout.CENTER_HORIZONTAL); numberCopies.setLayoutParams(layoutParamsNumberCopies); TextView priceCopies = new TextView(this); priceCopies.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); priceCopies.setGravity(Gravity.CENTER); numberCopies.setPadding(25, 25, 25, 25); priceCopies.setTextColor(getResources().getColor(R.color.redColor)); priceCopies.setText("$ 25 "); RelativeLayout.LayoutParams layoutParamsPriceCopies = (RelativeLayout.LayoutParams) priceCopies.getLayoutParams(); layoutParamsPriceCopies.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); priceCopies.setLayoutParams(layoutParamsPriceCopies); relativeLayout.addView(selectedPhoto); relativeLayout.addView(numberCopies); relativeLayout.addView(priceCopies); linearLayout.addView(relativeLayout); } scrollView.addView(linearLayout); setContentView(scrollView); 

我认为失败的块代码是这样的:

  //CODE FOR ADD MARGINS RelativeLayout.LayoutParams relativeParams = (RelativeLayout.LayoutParams)relativeLayout.getLayoutParams(); relativeParams.topMargin=80; relativeLayout.setLayoutParams(relativeParams); 

请帮忙吗?

有解决scheme。

LinearLayout中使用RelativeLayout ,需要使用LinearLayout.LayoutParams而不是RelativeLayout.LayoutParams

所以replace你的下面的代码…

 RelativeLayout.LayoutParams relativeParams = (RelativeLayout.LayoutParams)relativeLayout.getLayoutParams(); relativeParams.setMargins(0, 80, 0, 0); // left, top, right, bottom relativeLayout.setLayoutParams(relativeParams); 

与…

 // CODE FOR ADD MARGINS LinearLayout.LayoutParams linearParams = new LinearLayout.LayoutParams( new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); linearParams.setMargins(0, 80, 0, 0); relativeLayout.setLayoutParams(linearParams); relativeLayout.requestLayout(); 

你可以使用setMargins(int left,int top,int right,int bottom) 。

像这样试试

 //CODE FOR ADD MARGINS RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); relativeParams.setMargins(0, 80, 0, 0); relativeLayout.setLayoutParams(relativeParams); 

布局参数应该设置resp到parentLayout ..在这种情况下,它的LinearLayout由@ChintanRathod正确指出,所以

 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 

会做的伎俩..

请注意,您在线性布局内使用相对 布局,因此您应该使用LinearLayout.LayoutParams

我会replace这个:

  //RELATIVE LAYOUT RelativeLayout relativeLayout = new RelativeLayout(this); relativeLayout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT)); relativeLayout.setBackgroundColor(getResources().getColor(R.color.grayColor)); //CODE FOR ADD MARGINS RelativeLayout.LayoutParams relativeParams = (RelativeLayout.LayoutParams)relativeLayout.getLayoutParams(); relativeParams.topMargin=80; relativeLayout.setLayoutParams(relativeParams); 

这样 :

  //RELATIVE LAYOUT WITH PROPER LAYOUT PARAMS TO ADD MARGINS RelativeLayout relativeLayout = new RelativeLayout(this); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(0, 80, 0, 0); relativeLayout.setLayoutParams(params); relativeLayout.setBackgroundColor(getResources().getColor(R.color.grayColor)); 

还要注意,你应该使用WRAP_CONTENT作为垂直linearLayout中的儿童的高度configuration。 (在FILL_PARENTMATCH_PARENT模式下,它将填充父项而不会为其他子项留下空间)