Определение размеров должно находиться в папке 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 или другую единицу измерения.