LinearLayout的边距,以dp编程方式

55

是否可以以编程方式设置LinearLayout的边距,但不是以像素为单位,而是以dp为单位?

6个回答

137

你可以使用DisplayMetrics来确定屏幕密度。像这样:

int dpValue = 5; // margin in dips
float d = context.getResources().getDisplayMetrics().density;
int margin = (int)(dpValue * d); // margin in pixels

我记得最好使用flooring来进行偏移,使用rounding来进行宽度的四舍五入。


只是作为评论:您也可以使用TypedValue.applyDimensions(),但这种方式似乎更好,参见https://dev59.com/kXE95IYBdhLWcg3wN7Ov#2406790(Romain Guy是一位Android工程师) - bigstones
+1 - 我在代码中构建了几个小部件(而非使用XML),只能在那里设置像素。一旦我指定了SDK版本,我的布局就变得混乱了。我使用这个来修复它们... Android布局一定要使用XML!!! - tpow
1
如果您在没有上下文的Util类中,可以使用以下代码:Resources.getSystem().getDisplayMetrics().density。此代码段来源于这里 - Soon Santos

21

我遇到了同样的问题,并使用了以下技巧解决:

首先,我在我的res/values文件夹中添加了一个名为dimensions.xml的XML文件。它看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<resources>
  <dimen name="my_margin">5dip</dimen>
</resources>

其次,在我的代码中,我将该间距转换为像素,代码如下(请注意,我使用的是Xamarin,因此这是C#代码,但纯Java版本应该非常相似):

int myMarginPx = Resources.GetDimensionPixelSize(Resource.Dimension.my_margin);

最后,我创建了我的布局参数:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
layoutParams.SetMargins(myMarginPx, myMarginPx, myMarginPx, myMarginPx);

在 Android Java 中,可以编写以下代码来获取尺寸的整型值:int getDimenInt(Context context, @DimenRes int dimenRes){ return context.getResources().getDimensionPixelSize(dimenRes); } - 刘宇翔

9

您可以将dp转换为px,例如将5dp转换为px:

Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, r.getDisplayMetrics());

3
以下方法是我将像素转换为dp的方法,对于我来说非常有效:

int pixelToDP(int pixel) {
    final float scale = RaditazApplication.getInstance().getResources().getDisplayMetrics().density;
    return (int) ((pixel * scale) + 0.5f);
}

1

将 DP 转换为像素值

int Whatever_valueInDP=10;//value in dp
int Value_In_Pixel= (int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP, Whatever_valueInDP, getResources()
                    .getDisplayMetrics());

0

对于Kotlin的开发者们,我有一个非常方便的帮助函数,完美地解决了问题 :)

fun setMarginsInDp(v: View, l: Int, t: Int, r: Int, b: Int) {
    if (v.layoutParams is ViewGroup.MarginLayoutParams){
        val screenDensity: Float = v.context.resources.displayMetrics.density
        val params: ViewGroup.MarginLayoutParams = v.layoutParams as ViewGroup.MarginLayoutParams
        params.setMargins(l*screenDensity.toInt(), t*screenDensity.toInt(), r*screenDensity.toInt(), b*screenDensity.toInt())
        v.requestLayout()
    }
}

只需传入有效的视图,一切都设置好了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接