Ресурсы строк

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

Ресурсы строк - один из важных компонентов приложения. Мы используем их при выведении названия приложения, различного текста, например, текста кнопок и т.д.

XML-файлы, представляющие собой ресурсы строк, находятся в проекте в папке res/values. По умолчанию ресурсы строк находятся в файле strings.xml, который может выглядеть следующим образом:

<resources>
    <string name="app_name">ViewApp</string>
</resources>
Ресурсы строк в Android и Java

В самом простом виде этот файл определяет один ресурс "app_name", который устанавливает название приложения, которое мы видим в заголовке приложения на экране устройства. Но естественно мы можем определить любые строковые ресурсы. Каждый отдельный ресурс определяется с помощью элемента string, а его атрибут name содержит название ресурса.

Затем в приложении в файлах кода мы можем ссылаться на эти ресурсы:

R.string.app_name

Например, в коде Java:

String application_name =  getResources().getString(R.string.app_name);

Либо в xml-файле:

@string/app_name

Например, изменим файл res/values/strings.xml следующим образом:

<resources>
    <string name="app_name">ViewApp</string>
    <string name="message">Hello Android!</string>
</resources>

Здесь добавлен ресурс message со значением "Hello Android!".

Теперь используем ресурс в файле 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:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/message"
        android:textSize="30sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

С помощью выражения @string/message передаем атрибуту android:text значение из ресурса.

Ресурсы строк из strings.xml в Android Studio и Java

Аналогично мы могли бы использовать ресурс в коде Activity:

package com.example.viewapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // получаем элемент textView
        TextView textView = findViewById(R.id.textView);
        // переустанавливаем у него текст
        textView.setText(R.string.message);
    }
}

Если нам в принципе надо получить ресурс в коде Java (необязательно для установки текста в TextView), то в этом случае можно использовать метод getResources().getString(идентификатор_ресурса)

String message = getResources().getString(R.string.message);

Хотя по умолчанию для ресурсов строк применяется файл strings.xml, но разработчики могут добавлять дополнительные файлы ресурсов в каталог проекта res/values. При этом достаточно соблюдать структуру файла: он должен иметь корневой узел <resources> и иметь один или несколько элементов <string>.

Так, нажмем на папку res/values правой кнопкой мыши и в появившемся списке выберем пункт New -> Value Resource File:

Добавление ресурса строк в Android Studio

Причем следует отметить, что данный тип файлов будет характерен для любого типа ресурсов, который добавляется в папку res/values.

После этого нам будет предложено определить для файла имя:

String resources in Android Studio

Назовем, к примеру, headers (название файла произвольное), а для всех остальных полей оставим значения по умолчанию. И в папку res/values будет добавлен новый файл headers.xml. Определим в нем пару ресурсов:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="welcome">Добро пожаловать</string>
    <string name="click_button">Нажмите на кнопку</string>
</resources>

И после этого мы сможем использовать определенные здесь ресурсы в коде Activity или в файле layout.

Форматирование строк

Android позволяет применять к ресурсам строк форматирование. Например, изменим файл strings.xml:

<resources>
    <string name="app_name">ViewApp</string>
    <string name="message">Hello Android!</string>
    <string name="welcome_message">Добро пожаловать %1$s! Уже %2$d : %3$d</string>
</resources>

Третий ресурс - welcome_message представляет строку с форматированием. Так, она содержит такие символы как %1$s, %2$d и %3$d. Что они означают? %1$s указывает, что это первый аргумент, а символ "s" говорит, что этот аргумент представляет строку. %2$d представляет второй аргумент, а символ "d" в конце указывает, что это будет целое число. Аналогично %3$d указывает, что это третий аргумент, который представляет целое число.

Получим ресурс в коде Java

package com.example.viewapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TextView;

import java.util.Calendar;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);

        String userName = "Евгений";
        Calendar calendar = Calendar.getInstance();
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);

        String text = getString(R.string.welcome_message, userName, hour, minute);
        TextView textView = new TextView(this);
        textView.setText(text);
        textView.setTextSize(28);
        setContentView(textView);
    }
}

Метод getString(R.string.welcome_message, userName, hour, minute) получает ресурс welcome_message и в качестве последующих параметров передает его аргументам значения. Для первого аргумента-строки используется переменная userName, а для второго и третьего аргументов передаем текущее количество часов и минут, полученных с помощью класса Calendar.

Форматирование ресурса в string.xml в Android и Java

Ресурсы Plurals

Plurals представляют еще один вид набора строк. Он предназначен для описания количества элементов. Для чего это надо? К примеру, возьмем существительное: нередко оно изменяет окончание в зависимости от числительного, которое с ним употребляется: 1 цветок, 2 цветка, 5 цветков. Для подобных случаев и используется ресурс plurals.

Посмотрим на примере. Добавим в папку res/values новый ресурс. Назовем его flowers:

Ресурс Plurals в Android Studio

Изменим его содержимое следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <plurals name="flowers">
        <item quantity="one">%d цветок</item>
        <item quantity="few">%d цветка</item>
        <item quantity="many">%d цветков</item>
    </plurals>
</resources>

Для задания ресурса используется элемент <plurals>, для которого существует атрибут name, получающий в качестве значения произвольное название, по которому потом ссылаются на данный ресурс.

Сами наборы строк вводятся дочерними элементами <item>. Этот элемент имеет атрибут quantity, который имеет значение, указывающее, когда эта строка используется. Данный атрибут может принимать следующие значения:

  • zero: строка для количества в размере 0

  • one: строка для количества в размере 1 (для русского языка - для задания всех количеств, оканчивающихся на 1, кроме 11)

  • two: строка для количества в размере 2

  • few: строка для небольшого количества

  • many: строка для больших количеств

  • other: все остальные случаи

Причем в данном случае многое зависит от конкретного языка. А система сама позволяет определить, какое значение брать для того или иного числа.

Использование данного ресурса возможно толко в коде java. Поэтому изменим код MainActivity:

package com.example.viewapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        String rose = getResources().getQuantityString(R.plurals.flowers, 21, 21);

        TextView textView = new TextView(this);
        textView.setText(rose);
        textView.setTextSize(26);
        setContentView(textView);
    }
}

С помощью метода getQuantityString мы получаем значение ресурса. Первым параметром передаем идентификатор ресурса. Вторым параметром идет значение. для которого нужно найти нужную строку. Третий параметр представляет собой значение, которое будет вставляться на место плейсхолдера %d. То есть мы получаем строку для числа 21.

Определение ресурса plurals в Android

string array

Еще одним видом строковых ресурсов является string-array или массив строк. Например, добавим в папку res/values новый файл, который назовем languages.xml:

Определение ресурса string array в Android и Java

Пусть он будет содержать следующий код:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="languages">
        <item>Java</item>
        <item>Kotlin</item>
        <item>Dart</item>
    </string-array>
</resources>

Ресурс задается с помощью элемента <string-array>. Фактически он определяет набор строк. А каждая отдельная строка задается с помощью элемента <item>

В файле MainActivity.java определим код для получения значений из этого ресурса:

package com.example.viewapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        Resources res = getResources();
        String[] languages = res.getStringArray(R.array.languages);
        String allLangs = "";
        for (String lang: languages) {
            allLangs += lang + " ";
        }
        TextView textView = new TextView(this);
        textView.setText(allLangs);
        textView.setTextSize(28);
        setContentView(textView);
    }
}

С помощью метода getStringArray получаем ресурс в массив строк и затем с помощью цикла складдываем из массива одну строку и передаем ее в TextView.

Получение ресурса string array и getStringArray в Android и Java
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850