Android и настройка ширины и высоты программно в единицах dp

Я делаю:

button.setLayoutParams(new GridView.LayoutParams(65, 65));

Согласно документам единицы для ширины и высоты (оба из 65 в выше) являются «пикселями». Как заставить это быть независимыми от устройства пикселями или «dp»?

Вам придется преобразовать его из dps в пиксели, используя коэффициент масштабирования дисплея.

 final float scale = getContext().getResources().getDisplayMetrics().density; int pixels = (int) (dps * scale + 0.5f); 

Я знаю, что это старый вопрос, однако я нашел гораздо более простой способ сделать это преобразование.

 TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics()); 

Глядя на ваше требование, есть альтернативное решение. Кажется, вы знаете размеры в dp во время компиляции, поэтому вы можете добавить запись в ресурсы. Затем вы можете запросить запись dimen, и она будет автоматически преобразована в пиксели в этом вызове:

 final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp); 

И ваш dimens.xml будет иметь:

 72dp 

Расширяя эту идею, вы можете просто сохранить значение 1dp или 1sp как запись размера и запросить значение и использовать его как множитель. Используя этот подход, вы изолируете код от математического материала и полагаетесь на библиотеку для выполнения вычислений.

Простейший способ (и даже работает от api 1), который тестировался:

 getResources().getDimensionPixelSize(R.dimen.example_dimen); 

Из документации:

Извлеките размер для определенного идентификатора ресурса для использования в качестве размера в необработанных пикселях. Это то же самое, что и getDimension (int), за исключением того, что возвращаемое значение преобразуется в целочисленные пиксели для использования в качестве размера. Преобразование размера включает округление базового значения и обеспечение того, что ненулевое базовое значение имеет по меньшей мере один пиксель.

Да, это округление значения, но это не очень плохо (просто в нечетных значениях на устройствах hdpi и ldpi необходимо добавить небольшое значение, когда ldpi не очень распространен). Я тестировал устройство xxhdpi, которое преобразует 4dp в 16 (пикселей), и это правда.

Давайте будем гением компьютера.