Определение размеров должно находиться в папке res/values в файле с любым произвольным именем. Общий синтаксис определения ресурса следующий:
<?xml version="1.0" encoding="utf-8"?> <resources> <dimen name="имя_ресурса">используемый_размер</dimen> </resources>
Как и другие ресурсы, ресурс dimension определяется в корневом элементе <resources>
. Тег
<dimen>
обозначает ресурс и в качестве значния принимает некоторое значение размера в одной из принятых единиц измерения
(dp, sp, pt, px, mm, in). Более подробно установка размеров рассматривалась в одной из прошлых статей - Определение размеров
Так, добавим в Android Studio в папку res/values новый элемент Values Resources File, который назовем dimens.xml.
Определим в нем следующее содержимое:
<?xml version="1.0" encoding="utf-8"?> <resources> <dimen name="horizontal_margin">64dp</dimen> <dimen name="vertical_margin">32dp</dimen> <dimen name="text_size">32sp</dimen> </resources>
Здесь определены два ресурса для отступов horizontal_margin
и vertical_margin
, которые хранят соответственно значения 64dp и 32dp,
и ресурс text_size, который хранит высоту шрифта - 32sp. Названия ресурсов могут быть произвольными.
Используем ресурс в файле activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello Android" android:background="#eaeaea" android:layout_marginTop="@dimen/vertical_margin" android:layout_marginLeft="@dimen/horizontal_margin" android:textSize="@dimen/text_size" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Ресурсы dimension используются для таких атриубтов визуальных элементов, которые в качестве значения требуют указание числового значения. Например,
атриубут android:layout_height
или android:textSize
. Для получения ресурса в xml после "@dimen/"
указывается имя ресурса.
Для получения ресурсов в коде java применяется метод getDimension() класса Resources. Например, определим в коде Java аналогичный визуальный интерфейс:
package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import android.content.res.Resources; import android.os.Bundle; import android.util.TypedValue; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); // получаем ресурсы Resources resources = getResources(); float textSize = resources.getDimension(R.dimen.text_size); int hMargin = (int)resources.getDimension(R.dimen.horizontal_margin); int vMargin = (int)resources.getDimension(R.dimen.vertical_margin); ConstraintLayout constraintLayout = new ConstraintLayout(this); ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams (ConstraintLayout.LayoutParams.WRAP_CONTENT , ConstraintLayout.LayoutParams.WRAP_CONTENT); layoutParams.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID; layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID; TextView textView = new TextView(this); textView.setText("Hello Android"); textView.setBackgroundColor(0XFFEAEAEA); // устанавливаем размер шрифт по ресурсу textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); // устанавливаем отступы пв соответствии с ресурсами layoutParams.setMargins(hMargin, vMargin, hMargin, vMargin); textView.setLayoutParams(layoutParams); constraintLayout.addView(textView); setContentView(constraintLayout); } }
При программном получении ресурсов dimen с помощью метода getDimension()
следует учитывать, что он возвращает значения в физических пикселях,
даже если в файле ресурсов мы определили значения в других величинах (32sp, 64dp). В большинстве случае это не вызовет каких-то трудностей,
поскольку большинство методов в Java принимают именно пиксели, а не dp или другие единицы, как например, метод setMargins()
, который устанавливает отступы.
Однако метод setTextSize()
принимает именно sp, поэтому с помощью дополнительного параметра необходимо указать,
что в данном случае имеются в виду физические пиксели, а не sp:
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
Либо, как вариант, с помощью класса TypedValue программно перевести физические пиксели в sp или другую единицу измерения.