Android
Ресурсы
Поиск…
Перевести строку
Строки могут быть интернационализированы путем определения другого strings.xml для каждого поддерживаемого вами языка.
Вы добавляете новый язык, создавая новый каталог значений с кодом языка ISO в качестве суффикса. Например, при добавлении немецкого набора ваша структура может выглядеть следующим образом:
Когда система ищет запрашиваемую строку, она сначала проверяет специфический для языка xml, если он не найден, возвращается значение из файла strings.xml по умолчанию. Ключ остается неизменным для каждого языка, и изменяется только значение.
Пример содержимого:
/res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">HelloWorld</string>
<string name="hello_world">Hello World!</string>
</resources>
/res/values-fr/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello_world">Bonjour tout le monde !!!</string>
</resources>
Определить строки
Строки обычно хранятся в файле ресурсов strings.xml
. Они определяются с помощью XML-элемента <string>
.
Цель strings.xml - разрешить интернационализацию. Вы можете определить strings.xml для каждого языка iso-кода. Таким образом, когда система ищет строку «app_name», она сначала проверяет файл xml, соответствующий текущему языку, и если он не найден, ищет запись в файле strings.xml по умолчанию. Это означает, что вы можете выбрать локализовать некоторые из ваших строк, а не другие.
/res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Hello World App</string>
<string name="hello_world">Hello World!</string>
</resources>
Как только строка определена в файле ресурсов XML, ее можно использовать другими частями приложения.
Файлы проекта проекта XML могут использовать элемент <string>
, ссылаясь на @string/string_name
. Например, файл манифеста приложения (/manifests/AndroidManifest.xml) включает в себя следующую строку по умолчанию в Android Studio:
android:label="@string/app_name"
Это говорит андроиду искать ресурс <string>
называемый «имя приложения», для использования в качестве имени для приложения, когда он установлен или отображается в панели запуска.
В другой раз, когда вы используете ресурс <string>
из файла XML в android, вы будете в файле макета. Например, следующее представляет TextView, который отображает строку hello_world
мы определили ранее:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"/>
Вы также можете получить доступ к ресурсам <string>
из части java вашего приложения. Чтобы отозвать нашу же hello_world
сверху в классе Activity, используйте:
String helloWorld = getString(R.string.hello_world);
Определить массив строк
Чтобы определить строковый массив, напишите в файле ресурсов
RES / значения / filename.xml
<string-array name="string_array_name">
<item>text_string</item>
<item>@string/string_id</item>
</string-array>
например
RES / значения / arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="string_array_example">
<item>@string/app_name</item>
<item>@string/hello_world</item>
</string-array>
</resources>
и использовать его из java как
String[] strings = getResources().getStringArray(R.array.string_array_example;
Log.i("TAG",Arrays.toString(strings)));
Выход
I/TAG: [HelloWorld, Hello World!]
Определить размеры
Размеры обычно хранятся в именах файлов ресурсов dimens.xml
. Они определяются с помощью элемента <dimen>
.
RES / значения / dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="small_padding">5dp</dimen>
<dimen name="medium_padding">10dp</dimen>
<dimen name="large_padding">20dp</dimen>
<dimen name="small_font">14sp</dimen>
<dimen name="medium_font">16sp</dimen>
<dimen name="large_font">20sp</dimen>
</resources>
Вы можете использовать разные единицы:
- sp: Масштабируемые пиксели. Для шрифтов.
- dp: независимые от плотности пиксели. Для всего остального.
- pt: Очки
- px: пиксели
- мм: миллиметры
- im: Дюймы
Теперь размеры могут быть @dimen/name_of_the_dimension
в XML с синтаксисом @dimen/name_of_the_dimension
.
Например:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/large_padding">
</RelativeLayout>
Определить целые числа
Целые элементы обычно хранятся в файле ресурсов с именем integers.xml
, но имя файла может быть выбрано произвольно. Каждое целое число определяется с помощью элемента <integer>
, как показано в следующем файле:
RES / значения / integers.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="max">100</integer>
</resources>
Теперь целые числа можно ссылаться в XML с синтаксисом @integer/name_of_the_integer
, как показано в следующем примере:
<ProgressBar
android:layout_width="match_parent"
android:layout_height="match_parent"
android:max="@integer/max"/>
Определить целочисленный массив
Чтобы определить целочисленный массив, напишите в файле ресурсов
RES / значения / filename.xml
<integer-array name="integer_array_name">
<item>integer_value</item>
<item>@integer/integer_id</item>
</integer-array>
например
RES / значения / arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer-array name="fibo">
<item>@integer/zero</item>
<item>@integer/one</item>
<item>@integer/one</item>
<item>@integer/two</item>
<item>@integer/three</item>
<item>@integer/five</item>
</integer-array>
</resources>
и использовать его из java как
int[] values = getResources().getIntArray(R.array.fibo);
Log.i("TAG",Arrays.toString(values)));
Выход
I/TAG: [0, 1, 1, 2, 3, 5]
Определение цветов
Цвета обычно хранятся в файле ресурсов с именем colors.xml
в colors.xml
/res/values/
.
Они определяются элементами <color>
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="blackOverlay">#66000000</color>
</resources>
Цвета представлены шестнадцатеричными значениями цвета для каждого цветового канала (0 - FF)
в одном из форматов:
-
#RGB
-
#ARGB
-
#RRGGBB
-
#AARRGGBB
легенда
- Значение A - alpha channel - 0 полностью прозрачно, значение FF непрозрачно
- R - красный канал
- G - зеленый канал
- B - синий канал
Определенные цвета могут использоваться в XML со следующим синтаксисом @color/name_of_the_color
Например:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/blackOverlay">
Использование цветов в коде
Эти примеры предполагают, что this
ссылка на активность. Ссылка на контекст может использоваться и на своем месте.
int color = ContextCompat.getColor(this, R.color.black_overlay);
view.setBackgroundColor(color);
int color = this.getResources().getColor(this, R.color.black_overlay);
view.setBackgroundColor(color);
В вышеуказанной декларации colorPrimary
, colorPrimaryDark
и colorAccent
используются для определения цветов дизайна материалов, которые будут использоваться при определении пользовательской темы Android в styles.xml
. Они автоматически добавляются при создании нового проекта с помощью Android Studio.
Получение ресурсов без «устаревших» предупреждений
Используя Android API 23 или выше, очень часто можно увидеть такую ситуацию:
Эта ситуация вызвана структурными изменениями API Android в отношении получения ресурсов.
Теперь функция:
public int getColor(@ColorRes int id, @Nullable Theme theme) throws NotFoundException
должен быть использован. Но в библиотеке android.support.v4
есть другое решение.
Добавьте следующую зависимость в файл build.gradle
:
com.android.support:support-v4:24.0.0
Затем доступны все методы из библиотеки поддержки:
ContextCompat.getColor(context, R.color.colorPrimaryDark);
ContextCompat.getDrawable(context, R.drawable.btn_check);
ContextCompat.getColorStateList(context, R.color.colorPrimary);
DrawableCompat.setTint(drawable);
ContextCompat.getColor(context,R.color.colorPrimaryDark));
Кроме того, можно использовать больше методов из библиотеки поддержки:
ViewCompat.setElevation(textView, 1F);
ViewCompat.animate(textView);
TextViewCompat.setTextAppearance(textView, R.style.AppThemeTextStyle);
...
Определите ресурс меню и используйте его внутри Activity / Fragment
Определить меню в res / menu
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/first_item_id"
android:orderInCategory="100"
android:title="@string/first_item_string"
android:icon="@drawable/first_item_icon"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/second_item_id"
android:orderInCategory="110"
android:title="@string/second_item_string"
android:icon="@drawable/second_item_icon"
app:showAsAction="ifRoom"/>
</menu>
Дополнительные параметры конфигурации см. В разделе : Ресурс меню
Внутри Activity
:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
///Override defining menu resource
inflater.inflate(R.menu.menu_resource_id, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
//Override for preparing items (setting visibility, change text, change icon...)
super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Override it for handling items
int menuItemId = item.getItemId();
switch (menuItemId) {
case: R.id.first_item_id
return true; //return true, if is handled
}
return super.onOptionsItemSelected(item);
}
Для вызова методов выше при показе представления вызовите getActivity().invalidateOptionsMenu();
Внутри Fragment
дополнительный вызов:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
super.onCreateView(inflater, container, savedInstanceState);
}
Форматирование строк в strings.xml
Определение строк в файле strings.xml также позволяет форматировать строки. Единственное предостережение в том, что String нужно будет обрабатывать в коде, как показано ниже, или просто привязывать его к макету.
<string name="welcome_trainer">Hello Pokémon Trainer, %1$s! You have caught %2$d Pokémon.</string>
String welcomePokemonTrainerText = getString(R.string.welcome_trainer, tranerName, pokemonCount);
В приведенном выше примере,
% 1 $ s
«%» отделяется от обычных символов,
'1' обозначает первый параметр,
'$' используется как разделитель между номером параметра и типом,
's' обозначает тип строки ('d' используется для целого числа)
Обратите внимание: getString()
- это метод Context
или Resources
, т. getActivity().getString()
Вы можете использовать его непосредственно в экземпляре Activity
, иначе вы можете использовать getActivity().getString()
или getContext().getString()
соответственно.
Определить список состояний цвета
Списки состояния цвета могут использоваться как цвета, но будут меняться в зависимости от состояния вида, для которого они используются.
Чтобы определить один, создайте файл ресурсов в res/color/foo.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#888888" android:state_enabled="false"/>
<item android:color="@color/lightGray" android:state_selected="false"/>
<item android:color="@android:color/white" />
</selector>
Элементы оцениваются в том порядке, в котором они определены, и используется первый элемент, чьи указанные состояния соответствуют текущему состоянию представления. Таким образом, хорошая практика заключается в том, чтобы указать конечную точку, без каких-либо определенных селекторов.
Каждый элемент может использовать цветной литерал или ссылаться на цвет, определенный в другом месте.
Определение строковых множеств
Чтобы различать множественные и сингулярные строки, вы можете определить множественное число в файле strings.xml и указать разные количества, как показано в следующем примере:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="hello_people">
<item quantity="one">Hello to %d person</item>
<item quantity="other">Hello to %d people</item>
</plurals>
</resources>
Это определение можно получить из кода Java с помощью getQuantityString()
класса Resources
, как показано в следующем примере:
getResources().getQuantityString(R.plurals.hello_people, 3, 3);
Здесь первый параметр R.plurals.hello_people
- это имя ресурса. Второй параметр ( 3
в этом примере) используется для выбора правильной строки quantity
. Третий параметр (также 3
в этом примере) - это аргумент формата, который будет использоваться для замены спецификатора формата %d
.
Возможные значения количества (перечислены в алфавитном порядке):
few
many
one
other
two
zero
Важно отметить, что не все локали поддерживают каждую номинал quantity
. Например, китайский язык не имеет понятия об one
элементе. У английского языка нет zero
элемента, так как он грамматически совпадает с other
. Неподдерживаемые экземпляры quantity
будут помечены IDE как предупреждения Lint, но не будут вызывать ошибки сложности, если они используются.
Импортировать массив объектов, определенных в ресурсах
Бывают случаи, когда пользовательские объекты должны быть созданы и определены в ресурсах приложения. Такие объекты могут состоять из простых типов Java
, например Integer
, Float
, String
.
Ниже приведен пример того, как импортировать объект, определенный в ресурсах приложения. Объект Category
3 свойства категории:
- Я БЫ
- цвет
- название
Этот POJO
имеет эквивалент в файле categories.xml
, где каждый из массива имеет те же свойства, которые определены для каждой категории.
- Создайте модель для объекта:
public class Category {
private Type id;
private @ColorRes int color;
private @StringRes String name;
public Category getId() {
return id;
}
public void setId(Category id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
public enum Type{
REGISTRATION,
TO_ACCEPT,
TO_COMPLETE,
TO_VERIFY,
CLOSED
}
}
- Создайте файл в папке
res/values
:
categories.xml
- Составьте каждую модель, состоящую из ресурсов:
<array name="no_action">
<item>0</item>
<item>@android:color/transparent</item>
<item>@string/statusRegistration</item>
</array>
<array name="to_accept">
<item>1</item>
<item>@color/light_gray</item>
<item>@string/acceptance</item>
</array>
<array name="opened">
<item>2</item>
<item>@color/material_green_500</item>
<item>@string/open</item>
</array>
<array name="to_verify">
<item>3</item>
<item>@color/material_gray_800</item>
<item>@string/verification</item>
</array>
<array name="to_close">
<item>4</item>
<item>@android:color/black</item>
<item>@string/closed</item>
</array>
Определить массив в файле ресурсов:
<array name="categories"> <item>@array/no_action</item> <item>@array/to_accept</item> <item>@array/opened</item> <item>@array/to_verify</item> <item>@array/to_close</item> </array>
Создайте функцию для их импорта:
@NonNull public List<Category> getCategories(@NonNull Context context) { final int DEFAULT_VALUE = 0; final int ID_INDEX = 0; final int COLOR_INDEX = 1; final int LABEL_INDEX = 2; if (context == null) { return Collections.emptyList(); } // Get the array of objects from the `tasks_categories` array TypedArray statuses = context.getResources().obtainTypedArray(R.array.categories); if (statuses == null) { return Collections.emptyList(); } List<Category> categoryList = new ArrayList<>(); for (int i = 0; i < statuses.length(); i++) { int statusId = statuses.getResourceId(i, DEFAULT_VALUE); // Get the properties of one object TypedArray rawStatus = context.getResources().obtainTypedArray(statusId); Category category = new Category(); int id = rawStatus.getInteger(ID_INDEX, DEFAULT_VALUE); Category.Type categoryId; //The ID's should maintain the order with `Category.Type` switch (id) { case 0: categoryId = Category.Type.REGISTRATION; break; case 1: categoryId = Category.Type.TO_ACCEPT; break; case 2: categoryId = Category.Type.TO_COMPLETE; break; case 3: categoryId = Category.Type.TO_VERIFY; break; case 4: categoryId = Category.Type.CLOSED; break; default: categoryId = Category.Type.REGISTRATION; break; } category.setId(categoryId); category.setColor(rawStatus.getResourceId(COLOR_INDEX, DEFAULT_VALUE)); int labelId = rawStatus.getResourceId(LABEL_INDEX, DEFAULT_VALUE); category.setName(getString(context.getResources(), labelId)); categoryList.add(taskCategory); } return taskCategoryList; }
9 патчей
9 Патч - это растяжимые изображения, в которых области, которые могут быть растянуты, определяются черными маркерами на прозрачной границе.
Существует большой учебник здесь .
Несмотря на то, что он настолько стар, он по-прежнему так ценен, и он помог многим из нас глубоко понять 9 патч-экипировку.
К сожалению, недавно эта страница была отложена на некоторое время (сейчас она снова включена).
Следовательно, необходимо иметь физическую копию этой страницы для разработчиков Android на наших надежных серверах.
Вот.
ПРОСТОЕ РУКОВОДСТВО ДЛЯ 9-PATCH ДЛЯ ANDROID UI 18 мая 2011 г.
Пока я работал над своим первым Android-приложением, я нашел 9-patch (aka 9.png), чтобы запутать и плохо документировать. Через некоторое время я наконец понял, как это работает, и решил собрать что-то, чтобы помочь другим понять это.
В принципе, 9-patch использует прозрачность png, чтобы сделать расширенную форму 9-среза или scale9. Направляющие - прямые, 1-пиксельные черные линии, нарисованные на краю вашего изображения, которые определяют масштабирование и заливку вашего изображения. Назвав ваш файл изображения name.9.png, Android распознает формат 9.png и использует черные направляющие для масштабирования и заполнения ваших растровых изображений.
Вот базовая карта:
Как вы можете видеть, у вас есть руководства по каждой стороне вашего изображения. Направляющие TOP и LEFT предназначены для масштабирования вашего изображения (например, 9-среза), в то время как направляющие RIGHT и BOTTOM определяют область заполнения.
Черные направляющие линии отключаются / удаляются из вашего изображения - они не будут отображаться в приложении. Гиды должны быть только одного пикселя, поэтому, если вы хотите кнопку 48 × 48, ваш png будет фактически 50 × 50. Все, что толще, чем один пиксель, останется частью вашего изображения. (Мои примеры имеют направляющие шириной 4 пикселя для лучшей видимости. Они должны быть действительно только 1 пикселем).
Ваши направляющие должны быть сплошными черными (# 000000). Даже небольшое различие в цвете (# 000001) или альфа приведет к сбою и нормальному растяжению. Этот провал не будет очевидным *, он терпит неудачу! Да. В самом деле. Теперь ты знаешь.
Также вы должны иметь в виду, что оставшаяся область однопиксельного контура должна быть полностью прозрачной. Это включает в себя четыре угла изображения - они всегда должны быть четкими. Это может быть большой проблемой, чем вы понимаете. Например, если вы масштабируете изображение в Photoshop, оно добавит сглаженные пиксели, которые могут содержать почти невидимые пиксели, которые также могут привести к его сбою *. Если вы хотите масштабировать в Photoshop, используйте параметр Nearest Neighbor в раскрывающемся меню Resample Image (в нижней части всплывающего меню «Размер изображения»), чтобы сохранить острые края ваших направляющих.
* (обновлено 1/2012) Это фактически «исправление» в последнем наборе для разработчиков. Раньше это проявлялось бы, когда все ваши образы и ресурсы внезапно ломались, а не фактически сломанное изображение с 9 патчами.
Направляющие TOP и LEFT используются для определения масштабируемой части вашего изображения - LEFT для масштабирования высоты, TOP для масштабирования ширины. Используя образ кнопки в качестве примера, это означает, что кнопка может растягиваться горизонтально и вертикально внутри черной части, а все остальное, например, углы, будет оставаться того же размера. Позволяет иметь кнопки, которые могут масштабироваться до любого размера и поддерживать единообразный внешний вид.
Важно отметить, что 9-патч-изображения не уменьшаются - они только расширяются. Поэтому лучше всего начинать как можно меньше.
Кроме того, вы можете оставить части в середине линии шкалы. Например, если у вас есть кнопка с резким глянцевым краем по середине, вы можете оставить несколько пикселей в середине руководства LEFT. Центральная горизонтальная ось вашего изображения не будет масштабироваться, только части выше и ниже нее, поэтому ваш острый блеск не будет получать сглаживание или нечеткость.
Гиды области заполнения являются необязательными и обеспечивают способ определения области для таких вещей, как текстовая метка. Заполнение определяет, сколько места в вашем изображении помещается для размещения текста или значка или других вещей. 9-патч предназначен не только для кнопок, но и для фоновых изображений.
Приведенный выше пример кнопки & label преувеличен просто для объяснения идеи заполнения - ярлык не совсем точен. Честно говоря, я не знал, как Android делает многострочные метки, поскольку ярлык кнопки обычно представляет собой одну строку текста.
Наконец, вот хорошая демонстрация того, как гиды масштабирования и заливки могут меняться, например LinearLayout с фоновым изображением и полностью закругленными сторонами:
В этом примере руководство LEFT не используется, но мы по-прежнему должны иметь руководство. Фоновое изображение не масштабируется вертикально; он просто масштабируется горизонтально (на основе TOP-ориентира). Глядя на направляющие для заполнения, направляющие RIGHT и BOTTOM выходят за пределы, где они соответствуют изогнутым краям изображения. Это позволяет мне размещать круглые кнопки близко к краям фона для плотного, подогнанного вида.
Итак, это все. 9-patch очень просто, как только вы его получите. Это не идеальный способ масштабирования, но масштабные и многострочные шкалы-наборы обеспечивают большую гибкость, чем традиционный 9-срез и масштабирование9. Попробуйте, и вы быстро это выясните.
Уровень прозрачности (альфа)
Значения непрозрачности шестнадцатеричных
------------------------------
| Alpha(%) | Hex Value |
------------------------------
| 100% | FF |
| 95% | F2 |
| 90% | E6 |
| 85% | D9 |
| 80% | CC |
| 75% | BF |
| 70% | B3 |
| 65% | A6 |
| 60% | 99 |
| 55% | 8C |
| 50% | 80 |
| 45% | 73 |
| 40% | 66 |
| 35% | 59 |
| 30% | 4D |
| 25% | 40 |
| 20% | 33 |
| 15% | 26 |
| 10% | 1A |
| 5% | 0D |
| 0% | 00 |
------------------------------
Если вы хотите установить 45% на красный цвет.
<color name="red_with_alpha_45">#73FF0000</color>
шестнадцатеричное значение для красного цвета - # FF0000
Вы можете добавить 73 для непрозрачности 45% в префиксе - # 73FF0000
Работа с файлом strings.xml
Строковый ресурс предоставляет текстовые строки для вашего приложения с дополнительным стилем текста и форматированием. Существует три типа ресурсов, которые могут предоставить вашему приложению строки:
строка
XML resource that provides a single string.
Синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="string_name">text_string</string>
</resources>
И использовать эту строку в макете:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/string_name" />
Строковый массив
XML resource that provides an array of strings.
Синтаксис:
<resources>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
</string-array>
использование
Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);
Количество строк (плоских)
XML resource that carries different strings for pluralization.
Синтаксис:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals
name="plural_name">
<item
quantity=["zero" | "one" | "two" | "few" | "many" | "other"]
>text_string</item>
</plurals>
</resources>
Использование:
int count = getNumberOfsongsAvailable();
Resources res = getResources();
String songsFound = res.getQuantityString(R.plurals.plural_name, count, count);