Ресурсы dimension

Последнее обновление: 15.10.2021

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

Ресурс Dimension в Android Studio и Java, 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/" указывается имя ресурса.

Dimensions в Android и Java

Для получения ресурсов в коде 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 или другую единицу измерения.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850