• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-8-1 01:21:10 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

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

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

我希望将边距重置为 -3dp(我已经阅读了 here 如何从像素转换为 dp,所以一旦我知道如何在 px 中设置边距,我就可以自己管理转换)。但由于这是在 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(); 返回一个 ViewGroup.LayoutParams ,它没有属性 topMarginbottomMarginleftMarginrightMargin
您看到的 mc 实例只是一个 MarginContainer,其中包含偏移 (-3dp) 边距和 (oml, omr, omt, omb) 和原始边距 (ml, mr, mt, mb)。



Best Answer-推荐答案


您应该使用 LayoutParams设置按钮边距:

LayoutParams params = new LayoutParams(
        LayoutParams.WRAP_CONTENT,      
        LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);
yourbutton.setLayoutParams(params);

根据您使用的布局,您应该使用 RelativeLayout.LayoutParamsLinearLayout.LayoutParams .

并将您的 dp 度量转换为像素,请尝试以下操作:
Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        yourdpmeasure, 
        r.getDisplayMetrics()
);

关于android - 在 Android 中,如何以编程方式在 dp 中设置边距?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12728255/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap