Есть ли способ установить высоту/ширину LayoutParams как независимые от плотности пиксели (dp)? Похоже, что высота/ширина, когда программно заданы, находятся в пикселях, а не в dp.
Программно установить высоту на LayoutParams как независимые от плотности пиксели
Ответ 1
Вам нужно преобразовать значение dip в пиксели:
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());
Для меня это трюк.
Ответ 2
 public static int getDPI(int size, DisplayMetrics metrics){
     return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;        
 }
Вызвать эту функцию следующим образом:
DisplayMetrics metrics;
metrics = new DisplayMetrics();         
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int heigh = getDPI(height or width, metrics);
		Ответ 3
Вот мой фрагмент:
public class DpiUtils {
    public static int toPixels(int dp, DisplayMetrics metrics) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
    }
}
где DisplayMetrics metrics = getResources().getDisplayMetrics()
Ответ 4
Так как он может использоваться несколько раз:
public static int convDpToPx(Context context, float dp) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
}
Я счел более целесообразным использовать коэффициент конверсии, поскольку обычно необходимо преобразовать более одного значения. Поскольку коэффициент конверсии не изменяется, он сохраняет немного времени обработки.
/**
 * Get conversion rate from dp into px.<br>
 * E.g. to convert 100dp: px = (int) (100 * convRate);
 * @param context e.g. activity
 * @return conversion rate
 */
public static float convRateDpToPx(Context context) {
    return context.getResources().getDisplayMetrics().densityDpi / 160f;
}