Is it possible to set the Margins of a LinearLayout, programmatically but not with pixels, but dp?
55
votes
6 Answers
137
votes
You can use DisplayMetrics and determine the screen density. Something like this:
int dpValue = 5; // margin in dips
float d = context.getResources().getDisplayMetrics().density;
int margin = (int)(dpValue * d); // margin in pixels
As I remember it's better to use flooring for offsets and rounding for widths.
21
votes
I had the same issue and used this technique to solve it:
First, I added an xml file to my res/values folder called dimensions.xml. It looks like this:
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<dimen name="my_margin">5dip</dimen>
</resources>
Second, in my code, I got the pixel equivalent of that margin as follows (note I'm using Xamarin so this is C# code, but the pure Java version should be very similar):
int myMarginPx = Resources.GetDimensionPixelSize(Resource.Dimension.my_margin);
Finally, I create my layout params:
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
layoutParams.SetMargins(myMarginPx, myMarginPx, myMarginPx, myMarginPx);
9
votes
3
votes
1
votes
0
votes
Well for the kotlin guys i have got handy helper fun which works perfectly :)
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()
}
}
Just pass in a valid view and all set up!