当前位置: 首页 > 知识库问答 >
问题:

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

吴凯泽
2023-03-14

在这个,这个和这个线程,我试图找到一个答案,如何设置一个单一视图的边距。不过,我在想是不是没有更简单的方法。我将解释为什么我不想使用这种方法:

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

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

我想让边距重置为-3dp(我已经在这里阅读了如何从像素转换为dp,所以一旦我知道如何设置px中的边距,我可以自己管理转换)。但是,由于这是在customButton类中调用的,所以父级可以从LinearLayout到TableLayout,我不希望他得到父级并检查该父级的实例。我想那也会很糟糕的。

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

问题:除了使用LayoutParams之外,有没有更容易的方法以编程方式设置单个按钮的边距?

编辑:我知道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,该ViewGroup.LayoutParams不具有属性TopMarginBottomMarginLeftMarginRightMargin。您看到的mc实例只是一个MarginContainer,它包含偏移(-3DP)边距和(oml,omr,omt,omb)以及原始边距(ml,mr,mt,mb)。

共有1个答案

赵高韵
2023-03-14

应使用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()
);
 类似资料:
  • 问题内容: 我想设置in 的宽度和高度。将不存在。它是在这里创建的: 它被放置在这里: 所以基本上我所说的方法很多次,并填写我与封闭在。我需要将此高度设置为DP而不是像素,以便在所有设备上看起来都一样!!! 问题答案: 您需要将值转换为dps,可以使用以下函数进行操作: 然后,要将大小设置为px值,可以执行以下操作: (更改您所在的容器) 编辑:Kotlin版本 转换成Px的函数可以这样写在kot

  • 问题内容: 我正在尝试使用Java(不是XML)来创建一个LinearLayout,其线性按钮具有填满整个屏幕并具有边距的功能。这是不带边距的代码: 这样就可以了,但是到底如何给按钮留出一定的边距,以便在它们之间留出空间?我尝试使用,但是没有weight成员,所以不好。如果你lp在其构造函数中传递它,它也不起作用。 这不可能吗?因为它看起来确实可靠,而且它不是你只能使用XML进行的第一个Andro

  • 我在Android中以编程方式设置APN。当我运行代码时,我得到。如果我在清单中提到这个权限,我得到的错误就像这些权限只有SYSTEM APPS。你能帮我解决这个问题吗?参考链接

  • 我想通过编程方式设置视图的边距,我应该为设置50dp,我使用此代码 但在这段代码中,设置为50px!我怎么能设置这个50dp,而不是px?!

  • 如何在Android中以编程方式设置谷歌字体 应用程序崩溃原因:android。所容纳之物res.Resources$NotFoundException:无法检索字体资源ID#0x7f090002。

  • 我正在使用AutoLayout开发iPad应用程序,如果用户启用某个模式(“平视”模式),我希望只支持纵向(或纵向倒置)方向,而且,如果设备处于横向,我希望自动切换到纵向模式。 在顶视图控制器中,我有以下内容: 根据我在这里其他地方看到的答案,答案似乎是我应该使用“application SetStatusBaroOrientation”。因此,在用户选择“抬头”模式的方法中,我包括: 然而,这似