以编程方式设置边距不起作用
Posted
技术标签:
【中文标题】以编程方式设置边距不起作用【英文标题】:Setting margins programmatically isn't working 【发布时间】:2017-01-17 19:11:00 【问题描述】:我正在使用具有 android 版本 4.4.2 的物理设备开发本机 Android 项目。我在垂直线性布局中有一个按钮,我想以编程方式将顶部和底部边距设置为 0。
关于父视图的信息
LinearLayout.LayoutParams detailParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
LinearLayout detailContainer = new LinearLayout(this);
detailContainer.setOrientation(LinearLayout.VERTICAL);
detailContainer.setLayoutParams(detailParams);
按钮
LinearLayout.LayoutParams messageParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
messageParams.setMargins(10, 0, 10, 0);
// Displays the message
Button buttonWithMessage= new Button(this);
buttonWithMessage.setText(post.getMessage());
...
buttonWithMessage.setLayoutParams(messageParams);
将按钮添加到父视图
detailContainer.addView(buttonWithMessage);
但无论我在messageParams.setMargins(10, 0, 10, 0);
中输入什么值,边距都不会改变。我希望边距跨越整个宽度,除了左边和右边的一点点,顶部和底部都没有,所以它看起来很接触。我什至尝试为上面的每个父视图设置这些相同的参数,因为父视图都是线性布局但仍然没有。
【问题讨论】:
我没有看到您在更改新参数后将它们设置为视图 哎呀,不小心没贴出来,还有一些设置我跳过了 【参考方案1】:你应该使用 LayoutParams 来设置你的按钮边距:
LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);
yourbutton.setLayoutParams(params);
根据您使用的布局,您应该使用 RelativeLayout.LayoutParams 或 LinearLayout.LayoutParams。
【讨论】:
我不明白,我的例子是使用LinearLayout.LayoutParams
,你是说我应该让它更通用吗?【参考方案2】:
试试这样的
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
LinearLayout.LayoutParams detailParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
LinearLayout detailContainer = new LinearLayout(this);
detailContainer.setOrientation(LinearLayout.VERTICAL);
detailContainer.setLayoutParams(detailParams);
detailContainer.setBackgroundColor(Color.BLACK);
LinearLayout.LayoutParams messageParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
messageParams.setMargins(400, 400, 400, 400);
// Displays the message
Button buttonWithMessage = new Button(this);
buttonWithMessage.setText("Hai");
buttonWithMessage.setTransformationMethod(null);
// buttonWithMessage.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
buttonWithMessage.setTextColor(Color.BLACK);
buttonWithMessage.setBackgroundColor(Color.RED);
buttonWithMessage.setLayoutParams(messageParams);
detailContainer.addView(buttonWithMessage);
setContentView(detailContainer);
【讨论】:
@CookieMonster : 让我知道你的 cmt。 不会setContentView(detailContainer);
只是将其添加到当前活动中吗?我也将布局传递给其他方法
setContentView(detailContainer);设置活动布局
我不想设置活动布局,我只想更改此特定 LinearLayout 视图的设置并将其传递给扩展该类的另一个类。【参考方案3】:
您为 Button 使用了错误的 LayoutParams,这是有效的
RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.rel_test);
Button buttonWithMessage= new Button(this);
buttonWithMessage.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT));
RelativeLayout.LayoutParams test = (RelativeLayout.LayoutParams) buttonWithMessage.getLayoutParams();
test.setMargins(10, 0, 0, 0);
buttonWithMessage.setLayoutParams(test);
buttonWithMessage.setText("TEST");
relativeLayout.addView(buttonWithMessage);
【讨论】:
这是我添加到LinearLayout detailContainer = new LinearLayout(this);
的视图,到目前为止我没有在应用程序中使用任何相关布局。
无关紧要的重要部分是为按钮创建 realativelayout 参数,您可以将按钮添加到任何布局中以上是关于以编程方式设置边距不起作用的主要内容,如果未能解决你的问题,请参考以下文章
ConstraintLayout 的问题 - 垂直边距不起作用
以编程方式在 RealtiveLayout 中设置 LinearLayout 的边距 - 不起作用