4

我在设置边距时遇到了一些问题!

body_content = (LinearLayout) findViewById(R.id.body_content);

int gSLength = 2;
 body_content.setPadding(10, 0, 10, 0);

for (int i = 0; i < 1; i++){
   FrameLayout fl = new FrameLayout(this);
   LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, 90);
   fl.setLayoutParams(params);

   LinearLayout ll1 = new LinearLayout(this);
   LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 30);
   params1.setMargins(0, 60, 0, 0);
   ll1.setLayoutParams(params1);
   ll1.setBackgroundDrawable(getResources().getDrawable(R.drawable.line_down));
   fl.addView(ll1);

   body_content.addView(fl);
}

这没用params1.setMargins (0, 60, 0, 0);

4

1 回答 1

1

首先,Sherif 的评论是正确的:params1应该是FrameLayout.LayoutParamsand not的一个实例LinearLayout.LayoutParams
原因很简单:ll1是 FrameLayout 的子项,因此它必须为 FrameLayout 子项获取布局参数。

第二件事是FrameLayouts 严重依赖于gravity属性。在为 FrameLayout 子项创建布局参数的新实例时,默认gravity设置为-1(对于重力来说这是一个无效值)。如果孩子的重力设置为 -1,则在计算布局时会跳过整个边距计算。这意味着任何设置的边距值都会被忽略。

那么如何解决呢?很简单,在设置边距时设置正确的重力值:

LinearLayout.LayoutParams params1 = 
                    new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 30);
params1.gravity = Gravity.TOP;
params1.setMargins(0, 60, 0, 0);

那应该行得通。但是您选择的布局尺寸表明您希望将子 LinearLayout 放置在 FrameLayout 的底部。这可以通过将重力设置为底部来实现,在这种情况下您可以跳过设置边距。

LinearLayout.LayoutParams params1 = 
                    new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 30);
params1.gravity = Gravity.BOTTOM;
于 2011-11-19T18:27:15.140 回答