Поля LinearLayout, программно с dp

Можно ли задавать поля LinearLayout, программно, но не с пикселями, но dp?

Solutions Collecting From Web of "Поля LinearLayout, программно с dp"

Вы можете использовать DisplayMetrics и определять плотность экрана. Что-то вроде этого:

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

Насколько я помню, лучше использовать напольные покрытия для смещений и округления по ширине.

У меня была такая же проблема, и я использовал эту технику для ее решения:

Во-первых, я добавил файл xml в папку res / values ​​с именем dimension.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); 

Вы можете преобразовать dp в px, например преобразовать 5dp в px:

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

Следующий метод работает для меня для преобразования пикселей в dp:

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

Конвертировать значение DP в пиксель

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