Когда должен использоваться файл dimens.xml в Android?
Например, в конкретном макете у меня есть следующий XML:
<GridView
android:id="@+id/gridView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="3dp"
android:columnWidth="48dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="spacingWidth" />
Этот вид сетки специфичен для этого макета, и я не думаю, что буду использовать другие виды сетки со схожими свойствами. Это означает, что значения измерения в коде специфичны для этого вида сетки.
Должен ли я по-прежнему перемещать их в файл dimens.xml или это просто оставить их такими? Если это так, следует ли размещать значения в файле dimens.xml только тогда, когда это значение используется для нескольких макетов?
Ответы
Ответ 1
Я отбрасываю значения измерения в ресурс dimens.xml
, как правило, по трем причинам:
- Повторное использование: мне нужно несколько виджетах или макетам использовать одно и то же значение, и я хочу изменить его один раз при обновлении или настройке приложения.
- Разница в плотности: если мне нужно, чтобы размер был немного меньше или больше от ldpi → hdpi или small → large
- Чтение из кода: когда я создаю представление в коде и хочу применить некоторые статические измерения, помещая их в
dimens.xml
как "dp" или "dip", я могу получить масштабированное значение в Java-коде с помощью Resources.getDimensionPixelSize()
НТН!
Ответ 2
Файл dimens.xml
используется для хранения всех значений жестко закодированных пикселей в одном месте.
Теперь, хотя вы не можете повторно использовать эти значения прямо сейчас, все же рекомендуется разместить их в dimens.xml
для использования в будущем. Кроме того, следуя стандартной парадигме программирования Android
, другие разработчики быстрее понимают ваш код. Это очень похоже на strings.xml
, где мы помещаем String
, некоторые из которых в конечном итоге используются только один раз!:)
Ответ 3
Дополнительный ответ
@Devunwired перечисляет 3 причины использовать dimens.xml
. Вот подробности о том, как это сделать.
1. Повторное использование
Если вы установите значение dp
или sp
в dimens.xml
один раз, как этот
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="textview_padding">16dp</dimen>
<dimen name="large_text_size">30sp</dimen>
</resources>
вы можете повторно использовать его во всем приложении в нескольких местах.
<TextView
android:padding="@dimen/textview_padding"
android:textSize="@dimen/large_text_size"
... />
<TextView
android:padding="@dimen/textview_padding"
android:textSize="@dimen/large_text_size"
... />
Затем, когда вам нужно внести изменения, вам нужно всего лишь сделать это в одном месте.
Примечания
- Это в основном тот же эффект, что и стиль или тема.
- Будьте осторожны, чтобы не дать двум различным представлениям одно и то же значение
dimen
, если они действительно не должны быть. Если вам нужно внести изменения в один набор представлений, но не в другой, вам придется возвращаться к каждому в отдельности, что побеждает цель.
2. Разница в размере
- @Devunwired назвал эту разницу в плотности, но если вы используете
dp
(независимые от плотности пиксели), это уже позаботится о проблеме разности плотности для всех, кроме самых мелких случаев. Поэтому, на мой взгляд, размер экрана является более важным фактором для использования dimens.xml
.
Атрибут 8dp
может отлично выглядеть на телефоне, но когда приложение запускается на планшете, оно выглядит слишком узким. Вы можете решить эту проблему, выполнив две (или более) версии dimens.xml
.
Щелкните правой кнопкой мыши папку res
и выберите Новый > Файл ресурса значения. Затем напишите в dimens
и выберите Наименьшая ширина экрана. Напишите в 600 для ширины (7-дюймовый планшет). (Существуют другие способы выбора размеров. См. Документацию и этот ответ для более.)
![введите описание изображения здесь]()
Это создаст другую папку values
, которая будет использоваться для устройств с наименьшей шириной экрана 600dp
. В представлении Android два файла dimens.xml
выглядят следующим образом.
![введите описание изображения здесь]()
Теперь вы можете изменять их самостоятельно.
значения/dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="my_default_padding">16dp</dimen>
</resources>
значения-sw600dp/dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="my_default_padding">64dp</dimen>
</resources>
При использовании dimen
вам нужно только установить его с именем, которое вы использовали в обоих файлах dimens.xml
.
<LinearLayout
...
android:padding="@dimen/my_default_padding">
</LinearLayout>
Система автоматически выберет правильное значение для вас в зависимости от используемого пользователем устройства.
3. Чтение из кода
Иногда это программное расширение боли между px
и dp
(см. этот ответ).
Если у вас есть фиксированное значение dp
, уже определенное в dimens.xml
, как этот
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="my_dp_value">16dp</dimen>
</resources>
Затем вы можете легко получить его с помощью
int sizeInPixels = getResources().getDimensionPixelSize(R.dimen.my_dp_value);
и он уже будет преобразован в пиксели для любого устройства плотности, которое пользователь имеет.