在 Android 中,如何以编程方式在 dp 中设置边距?

文章讨论了在Android开发中,如何在不依赖LayoutParams的情况下,为自定义按钮动态设置边距。作者希望避免针对不同容器类型如LinearLayout、RelativeLayout或TableRow处理LayoutParams,并寻找一种更简单的方法。目前的解决方案涉及到检查LayoutParams的类型并分别设置边距。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跳到主内容

在这个、这个和这个线程中,我试图找到有关如何在单个视图上设置边距的答案。但是,我想知道是否有更简单的方法。我将解释为什么我不想使用这种方法:

我有一个扩展按钮的自定义按钮。如果背景设置为默认背景以外的其他设置(通过调用 或setBackgroundResource(int id)setBackgroundDrawable(Drawable d),我希望边距为 0。如果我这样调用:

public void setBackgroundToDefault() {
    backgroundIsDefault = true;
    super.setBackgroundResource(android.R.drawable.btn_default);
    // Set margins somehow
}

我希望边距重置为 -3dp(我已经在这里阅读了如何从像素转换为 dp,所以一旦我知道如何以像素为单位设置边距,我就可以自己管理转换)。但是因为这是在CustomButton类中调用的,父级可以从 LinearLayout 到 TableLayout 不等,我宁愿不让他得到他的父级并检查那个父级的实例。我想这也将是相当低效的。

另外,在调用(使用 LayoutParams)时parentLayout.addView(myCustomButton, newParams),我不知道这是否会将它添加到正确的位置(但是还没有尝试过),比如五行中的中间按钮。

问题:除了使用 LayoutParams 之外,是否有更简单的方法以编程方式设置单个 Button 的边距 

编辑:我知道 LayoutParams 方式,但我想要一个避免处理每种不同容器类型的解决方案:

ViewGroup.LayoutParams p = this.getLayoutParams();
    if (p instanceof LinearLayout.LayoutParams) {
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
    else if (p instanceof RelativeLayout.LayoutParams) {
        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
    else if (p instanceof TableRow.LayoutParams) {
        TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
}

因为this.getLayoutParams();返回的 aViewGroup.LayoutParams没有属性topMarginbottomMarginleftMarginrightMargin。您看到的 mc 实例只是一个MarginContainer包含偏移 (-3dp) 边距和 (oml、omr、omt、omb) 和原始边距 (ml、mr、mt、mb) 的 a。


 

解答http://www.stackoverflow.ink/posts/zai-android-zhong-ru-he-yi-bian-cheng-fang-shi-zai-dp-zhong-she-zhi-bian-ju/?f=2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿来是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值