以编程方式设置边距不起作用

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 参数,您可以将按钮添加到任何布局中

以上是关于以编程方式设置边距不起作用的主要内容,如果未能解决你的问题,请参考以下文章

运行时的WPF窗口边距不起作用

ConstraintLayout 的问题 - 垂直边距不起作用

以编程方式在 RealtiveLayout 中设置 LinearLayout 的边距 - 不起作用

Swift编程约束下边距不起作用

Android:以编程方式在 FrameLayout 中设置边距 - 不起作用

CollectionView 边距不一样