blob: 6a287b8972aaf7c7e711c8cf97a76f6772314067 [file] [log] [blame]
Trevor Johns682c24e2016-04-12 10:13:47 -07001page.title=Предоставление ресурсов
2parent.title=Ресурсы приложения
3parent.link=index.html
4@jd:body
5
6<div id="qv-wrapper">
7<div id="qv">
8 <h2>Краткое описание</h2>
9 <ul>
10 <li>Разные типы ресурсов находятся в разных подкаталогах каталога {@code res/}</li>
11 <li>Альтернативные ресурсы представляют собой файлы ресурсов для определенных конфигураций</li>
12 <li>Обязательно включайте ресурсы по умолчанию, чтобы приложение не зависело от конфигураций конкретного
13устройства</li>
14 </ul>
15 <h2>Содержание документа</h2>
16 <ol>
17 <li><a href="#ResourceTypes">Группирование типов ресурсов</a></li>
18 <li><a href="#AlternativeResources">Предоставление альтернативных ресурсов</a>
19 <ol>
20 <li><a href="#QualifierRules">Правила квалификатора имени</a></li>
21 <li><a href="#AliasResources">Создание псевдонимов ресурсов</a></li>
22 </ol>
23 </li>
24 <li><a href="#Compatibility">Обеспечение оптимальной совместимости устройства с ресурсами</a></li>
25 <li><a href="#BestMatch">Как Android находит наиболее подходящий ресурс</a></li>
26 </ol>
27
28 <h2>См. также:</h2>
29 <ol>
30 <li><a href="accessing-resources.html">Доступ к ресурсам</a></li>
31 <li><a href="available-resources.html">Типы ресурсов</a></li>
32 <li><a href="{@docRoot}guide/practices/screens_support.html">Поддержка
33нескольких экранов</a></li>
34 </ol>
35</div>
36</div>
37
38<p>Обязательно необходимо экспортировать из кода ресурсы приложения, такие как изображения и строки,
39для последующей их независимой обработки. Следует также обеспечить альтернативные ресурсы для
40определенных конфигураций устройств, группируя их в каталогах ресурсов со специальными именами. В
41режиме выполнения Android использует соответствующие ресурсы с учетом текущей конфигурации. Например,
42можно предоставлять другой макет пользовательского интерфейса в зависимости от размера экрана или различные
43строки в зависимости от настройки языка.</p>
44
45<p>После выполнения экспорта ресурсов приложения можно обращаться к ним
46с помощью идентификаторов ресурсов, которые генерируются в классе {@code R} вашего проекта. Использование
47ресурсов в приложении рассмотрено в разделе <a href="accessing-resources.html">Доступ
48к ресурсам</a>. В этом документе показано, как группировать ресурсы в проекте Android и
49предоставлять альтернативные ресурсы для определенных конфигураций устройств.</p>
50
51
52<h2 id="ResourceTypes">Группирование типов ресурсов</h2>
53
54<p>Следует поместить ресурсы каждого типа в определенный подкаталог каталога
55{@code res/} вашего проекта. В качестве примера приведена иерархия файлов для простого проекта:</p>
56
57<pre class="classic no-pretty-print">
58MyProject/
59 src/ <span style="color:black">
60 MyActivity.java </span>
61 res/
62 drawable/ <span style="color:black">
63 graphic.png </span>
64 layout/ <span style="color:black">
65 main.xml
66 info.xml</span>
67 mipmap/ <span style="color:black">
68 icon.png </span>
69 values/ <span style="color:black">
70 strings.xml </span>
71</pre>
72
73<p>Как видно в этом примере, каталог {@code res/} содержит все ресурсы
74подкаталогах): ресурс-изображение, два ресурса-макета, каталоги {@code mipmap/} для значков
75запуска и файл строк. Имена каталогов
76ресурсов очень важны и описаны в таблице 1.</p>
77
78<p class="note"><strong>Примечание.</strong> Подробные сведения об использовании папок множественного отображения см. в разделе
79<a href="{@docRoot}tools/projects/index.html#mipmap">Обзор управления проектами</a>.</p>
80
81<p class="table-caption" id="table1"><strong>Таблица 1.</strong> Каталоги ресурсов,
82поддерживаемые в каталоге {@code res/} проекта.</p>
83
84<table>
85 <tr>
86 <th scope="col">Каталог</th>
87 <th scope="col">Тип ресурсов</th>
88 </tr>
89
90 <tr>
91 <td><code>animator/</code></td>
92 <td>Файлы XML, которые определяют <a href="{@docRoot}guide/topics/graphics/prop-animation.html">анимации
93свойств</a>.</td>
94 </tr>
95
96 <tr>
97 <td><code>anim/</code></td>
98 <td>Файлы XML, которые определяют <a href="{@docRoot}guide/topics/graphics/view-animation.html#tween-animation">анимации
99преобразований</a>. (Анимации свойств также можно сохранять в этом каталоге, но
100для анимаций свойств предпочтительнее использовать каталог {@code animator/}, чтобы различать эти два
101типа).</td>
102 </tr>
103
104 <tr>
105 <td><code>color/</code></td>
106 <td>Файлы XML, которые определяют список состояний цветов. См. раздел <a href="color-list-resource.html">Ресурс списка
107состояний цветов</a></td>
108 </tr>
109
110 <tr>
111 <td><code>drawable/</code></td>
112
113 <td><p>Файлы растровых изображений ({@code .png}, {@code .9.png}, {@code .jpg}, {@code .gif}) или файлы XML, которые
114составляют следующие подтипы графических ресурсов:</p>
115 <ul>
116 <li>Файлы растровых изображений</li>
117 <li>Файлы из девяти фрагментов (растровые изображения с возможностью изменения размера)</li>
118 <li>Списки состояний</li>
119 <li>Формы</li>
120 <li>Графические анимации</li>
121 <li>Другие графические элементы</li>
122 </ul>
123 <p>См. раздел <a href="drawable-resource.html">Графические ресурсы</a>.</p>
124 </td>
125 </tr>
126
127 <tr>
128 <td><code>mipmap/</code></td>
129 <td>Графические файлы для значков запуска с различной плотностью. Подробные сведения об управлении
130значками запуска с помощью папок {@code mipmap/} см. в разделе
131 <a href="{@docRoot}tools/project/index.html#mipmap">Обзор управления проектами</a>.</td>
132 </tr>
133
134 <tr>
135 <td><code>layout/</code></td>
136 <td>Файлы XML, которые определяют макет пользовательского интерфейса.
137 См. раздел <a href="layout-resource.html">Ресурсы макетов</a>.</td>
138 </tr>
139
140 <tr>
141 <td><code>menu/</code></td>
142 <td>Файлы XML, которые определяют меню приложения, такие как меню параметров, контекстные меню или вложенные
143меню. См. раздел <a href="menu-resource.html">Ресурсы меню</a>.</td>
144 </tr>
145
146 <tr>
147 <td><code>raw/</code></td>
148 <td><p>Произвольные файлы для сохранения в исходной форме. Чтобы открыть эти ресурсы с помощью
149{@link java.io.InputStream}, вызовите {@link android.content.res.Resources#openRawResource(int)
150Resources.openRawResource()} с идентификатором ресурса, который имеет вид {@code R.raw.<em>filename</em>}.</p>
151 <p>Однако, если требуется получить доступ к исходным именам файлов и иерархии файлов, можно
152сохранять некоторые ресурсы в каталоге {@code
153assets/} (вместо каталога {@code res/raw/}). Файлы в каталоге {@code assets/} не получают
154идентификатора ресурса, поэтому их чтение возможно только с помощью {@link android.content.res.AssetManager}.</p></td>
155 </tr>
156
157 <tr>
158 <td><code>values/</code></td>
159 <td><p>Файлы XML, которые содержат простые значения, такие как строки, целые числа и цвета.</p>
160 <p>Тогда как XML-файлы ресурсов в других подкаталогах каталога {@code res/} определяют отдельные ресурсы
161на базе имени файла XML, файлы в каталоге {@code values/} описывают несколько ресурсов.
162Для файла в этом каталоге каждый дочерний элемент элемента {@code &lt;resources&gt;} определяет один
163ресурс. Например, элемент {@code &lt;string&gt;} создает ресурс
164{@code R.string}, а элемент {@code &lt;color&gt;} создает ресурс {@code R.color}
165.</p>
166 <p>Так как каждый ресурс определяется с помощью своего собственного элемента XML, можно назначать имя файла
167по своему усмотрению и помещать ресурсы разных типов в один файл. Тем не мене, может
168появиться необходимость поместить ресурсы отдельных типов в разные файлы. Например, ниже приведены соглашения для имен файлов
169ресурсов, которые можно создать в этом каталоге:</p>
170 <ul>
171 <li>arrays.xml для ресурсов-массивов (<a href="more-resources.html#TypedArray">массивы с указанием типа</a>)</li>
172 <li>colors.xml для <a href="more-resources.html#Color">значений цветов</a></li>
173 <li>dimens.xml для <a href="more-resources.html#Dimension">значений единиц измерений</a></li>
174 <li>strings.xml для <a href="string-resource.html">строковых
175значений</a></li>
176 <li>styles.xml для <a href="style-resource.html">стилей</a>.</li>
177 </ul>
178 <p>См. разделы <a href="string-resource.html">Строковые ресурсы</a>,
179 <a href="style-resource.html">Ресурсы стиля</a> и
180 <a href="more-resources.html">Дополнительные типы ресурсов</a>.</p>
181 </td>
182 </tr>
183
184 <tr>
185 <td><code>xml/</code></td>
186 <td>Произвольные XML-файлы, которые можно читать в режиме выполнения вызовом метода {@link
187android.content.res.Resources#getXml(int) Resources.getXML()}. Здесь должны сохраняться различные файлы конфигурации XML,
188например, <a href="{@docRoot}guide/topics/search/searchable-config.html">конфигурация с возможностью поиска</a>.
189<!-- or preferences configuration. --></td>
190 </tr>
191</table>
192
193<p class="caution"><strong>Предупреждение!</strong> Не сохраняйте файлы ресурсов непосредственно в
194каталоге {@code res/}, так как это вызывает ошибку компилятора.</p>
195
196<p>Дополнительную информацию об определенных типах ресурсов см. в документации <a href="available-resources.html">Типы ресурсов</a>.</p>
197
198<p>Ресурсы, сохраненные в подкаталогах, которые описаны в таблице 1, являются ресурсами
199«по умолчанию». Таким образом, эти ресурсы определяют дизайн и содержимое приложения по умолчанию.
200Однако различные типы устройств Android могут вызывать различные типы ресурсов.
201Например, если устройство оснащено экраном больше нормального, следует предоставить
202другие ресурсы макета, которые будут использовать преимущества дополнительного места на экране. Или, если устройство
203содержит различные языковые настройки, следует предоставить другие строковые ресурсы, содержащие перевод
204текста пользовательского интерфейса. Чтобы предоставить разные ресурсы для разных конфигураций устройств,
205необходимо предоставить альтернативные ресурсы в дополнение к ресурсам
206по умолчанию.</p>
207
208
209<h2 id="AlternativeResources">Предоставление альтернативных ресурсов</h2>
210
211
212<div class="figure" style="width:429px">
213<img src="{@docRoot}images/resources/resource_devices_diagram2.png" height="167" alt="" />
214<p class="img-caption">
215<strong>Рисунок 1.</strong> Два разных устройства, которые используют разные ресурсы макета.</p>
216</div>
217
218<p>Почти каждое приложение должно предоставлять альтернативные ресурсы, чтобы поддерживать определенные конфигурации
219устройств. Например, необходимо включить альтернативные графические ресурсы для экранов с
220разной плотностью растра и альтернативные ресурсы для разных языков. В режиме выполнения Android
221определяет конфигурацию устройства и загружает соответствующие
222ресурсы для приложения.</p>
223
224<p>Чтобы указать альтернативы для конкретных конфигураций набора ресурсов, выполните следующие действия:</p>
225<ol>
226 <li>Создайте новый каталог в каталоге {@code res/} с именем следующего вида {@code
227<em>&lt;имя_ресурса&gt;</em>-<em>&lt;квалификатор_конфигурации&gt;</em>}.
228 <ul>
229 <li><em>{@code &lt;resources_name&gt;}</em> – имя каталога соответствующих ресурсов
230по умолчанию (определено в таблице 1).</li>
231 <li><em>{@code &lt;qualifier&gt;}</em> – имя, которое указывает определенную конфигурацию,
232для которой должны использоваться эти ресурсы (определено в таблице 2).</li>
233 </ul>
234 <p>Можно добавлять несколько квалификаторов <em>{@code &lt;qualifier&gt;}</em>. Разделяйте их
235знаком дефиса.</p>
236 <p class="caution"><strong>Предупреждение!</strong> При добавлении нескольких квалификаторов необходимо
237располагать их в том же порядке, в котором они перечислены в таблице 2. Если порядок квалификаторов нарушен,
238 ресурсы игнорируются.</p>
239 </li>
240 <li>Сохраните соответствующие альтернативные ресурсы в этом новом каталоге. Файлы ресурсов должны
241иметь имена, точно совпадающие с именами файлов ресурсов по умолчанию.</li>
242</ol>
243
244<p>В качестве примера здесь приведено несколько ресурсов по умолчанию и альтернативных ресурсов:</p>
245
246<pre class="classic no-pretty-print">
247res/
248 drawable/ <span style="color:black">
249 icon.png
250 background.png </span>
251 drawable-hdpi/ <span style="color:black">
252 icon.png
253 background.png </span>
254</pre>
255
256<p>Квалификатор {@code hdpi} указывает, что ресурсы в этом каталоге предназначены для устройств, оснащенных экраном
257высокой плотности. Изображения в каждом из этих каталогов для графических объектов имеют размер для определенной плотности
258экрана, но имена файлов полностью
259совпадают. Таким образом, идентификатор ресурса, который указывает на изображение {@code icon.png} или {@code
260background.png}, всегда одинаков, но Android выбирает
261версию каждого ресурса, которая оптимально соответствует текущему устройству, сравнивая информацию о конфигурации устройства
262с квалификаторами в имени каталога ресурсов.</p>
263
264<p>Android поддерживает несколько квалификаторов конфигурации, позволяя
265добавлять несколько квалификаторов к одному имени каталога, разделяя квалификаторы дефисом. В таблице 2
266перечислены допустимые квалификаторы конфигурации в порядке приоритета &mdash; если используется несколько
267квалификаторов для каталога ресурсов, необходимо добавлять их к имени каталога в том порядке, в котором
268они перечислены в таблице.</p>
269
270
271<p class="table-caption" id="table2"><strong>Таблица 2.</strong> Имена квалификаторов
272конфигурации.</p>
273<table>
274 <tr>
275 <th>Конфигурация</th>
276 <th>Значения квалификатора</th>
277 <th>Описание</th>
278 </tr>
279 <tr id="MccQualifier">
280 <td>MCC и MNC</td>
281 <td>Примеры:<br/>
282 <code>mcc310</code><br/>
283 <code><nobr>mcc310-mnc004</nobr></code><br/>
284 <code>mcc208-mnc00</code><br/>
285 и т. д.
286 </td>
287 <td>
288 <p>Код страны для мобильной связи (MCC), за которым может следовать код сети мобильной связи (MNC)
289 из SIM-карты устройства. Например, <code>mcc310</code> – код США для любого поставщика услуг,
290 <code>mcc310-mnc004</code> – код США для Verizon и <code>mcc208-mnc00</code> – код Франции
291 для Orange.</p>
292 <p>Если в устройстве используется радиосвязь (телефон GSM), значения MCC и MNC добываются
293 из SIM-карты.</p>
294 <p>Можно также использовать только код MCC (например, для включения в приложении разрешенных в стране
295ресурсов). Если требуется указать только язык, используйте квалификатор
296<em>язык и регион</em> (обсуждается ниже). Если принято решение использовать квалификатор MCC и
297MNC, следует делать это с осторожностью и проверить корректность его работы.</p>
298 <p>См. также поля конфигурации {@link
299android.content.res.Configuration#mcc} и {@link
300android.content.res.Configuration#mnc}, которые указывают текущий код страны при мобильной связи
301и код сети мобильной связи соответственно.</p>
302 </td>
303 </tr>
304 <tr id="LocaleQualifier">
305 <td>Язык и регион</td>
306 <td>Примеры:<br/>
307 <code>en</code><br/>
308 <code>fr</code><br/>
309 <code>en-rUS</code><br/>
310 <code>fr-rFR</code><br/>
311 <code>fr-rCA</code><br/>
312 и т. д.
313 </td>
314 <td><p>Язык задается двухбуквенным кодом языка <a href="http://www.loc.gov/standards/iso639-2/php/code_list.php">ISO
315 639-1</a>, к которому можно добавить двухбуквенный код региона
316 <a href="http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html">ISO
317 3166-1-alpha-2</a> (которому предшествует строчная буква "{@code r}").
318 </p><p>
319 Коды <em>не</em> зависят от регистра; префикс {@code r} служит для
320обозначения кода региона.
321 Нельзя указывать только код региона.</p>
322 <p>Он может измениться за время работы
323приложения, если пользователь изменяет свой язык в системных настройках. В разделе <a href="runtime-changes.html">Обработка изменений в режиме выполнения</a> содержится информация
324о воздействии таких изменений на приложение во время выполнения.</p>
325 <p>В разделе <a href="localization.html">Локализация</a> приведено полное руководство по локализации
326приложения для других языков.</p>
327 <p>См. также поле конфигурации {@link android.content.res.Configuration#locale}, которое
328указывает текущий язык.</p>
329 </td>
330 </tr>
331 <tr id="LayoutDirectionQualifier">
332 <td>Направление макета</td>
333 <td><code>ldrtl</code><br/>
334 <code>ldltr</code><br/>
335 </td>
336 <td><p>Направление макета для приложения. Квалификатор {@code ldrtl} означает «направление макета справа налево».
337Квалификатор {@code ldltr} означает «направление макета слева направо» и используется по умолчанию.
338 </p>
339 <p>Эти квалификаторы можно применять к любым ресурсам, таким как макеты, графические элементы или значения.
340 </p>
341 <p>Например, если требуется предоставить специальный макет для арабского языка и
342общий макет для других языков, использующих написание «справа налево» (таких как фарси или иврит), используйте следующий код:
343 </p>
344<pre class="classic no-pretty-print">
345res/
346 layout/ <span style="color:black">
347 main.xml </span>(Default layout)
348 layout-ar/ <span style="color:black">
349 main.xml </span>(Specific layout for Arabic)
350 layout-ldrtl/ <span style="color:black">
351 main.xml </span>(Any "right-to-left" language, except
352 for Arabic, because the "ar" language qualifier
353 has a higher precedence.)
354</pre>
355 <p class="note"><strong>Примечание.</strong> Чтобы включить в приложение функцию макета «справа налево»,
356необходимо установить для параметра <a href="{@docRoot}guide/topics/manifest/application-element.html#supportsrtl">{@code
357 supportsRtl}</a> значение {@code "true"} и для параметра <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> значение 17 или больше.</p>
358 <p><em>Добавлено в API уровня 17.</em></p>
359 </td>
360 </tr>
361 <tr id="SmallestScreenWidthQualifier">
362 <td>smallestWidth</td>
363 <td><code>sw&lt;N&gt;dp</code><br/><br/>
364 Примеры:<br/>
365 <code>sw320dp</code><br/>
366 <code>sw600dp</code><br/>
367 <code>sw720dp</code><br/>
368 и т. д.
369 </td>
370 <td>
371 <p>Основной размер экрана, указывающий минимальный размер доступной
372области экрана. Точнее говоря, минимальная ширина устройства – это наименьший из двух размеров экрана:
373высоты и ширины (можно также называть ее «меньшей стороной» экрана). Этот квалификатор
374позволяет гарантировать, что независимо от текущей ориентации экрана
375приложение имеет доступную ширину пользовательского интерфейса не менее {@code &lt;N&gt;} пикселов.</p>
376 <p>Например, если для макета требуется, чтобы минимальный размер области экрана всегда был
377не менее 600 пикселов, можно использовать этот квалификатор для создания ресурсов этого макета, {@code
378res/layout-sw600dp/}. Система будет использовать эти ресурсы только в том случае, если минимальный размер
379доступной области экрана составляет не менее 600 пикселов, независимо от воспринимаемой пользователем
380высоты или ширины. Значение минимальной ширины является постоянной характеристикой размера экрана для устройства; <strong>минимальная
381ширина устройства не изменяется при изменении ориентации экрана</strong>.</p>
382 <p>Минимальная ширина устройства учитывает оформление экрана и пользовательский интерфейс системы. Например,
383если не экране присутствуют постоянные элементы пользовательского интерфейса, которые занимают пространство вдоль
384оси минимальной ширины, система объявляет, что минимальная ширина меньше фактического
385размера экрана, так как эти пикселы экрана недоступны для пользовательского интерфейса приложения. Следовательно используемое значение
386должно быть фактическим наименьшим размером, <em>который необходим для вашего макета</em> (обычно это значение является
387«минимальной шириной», которую поддерживает ваш макет, независимо от текущей ориентации экрана).</p>
388 <p>Здесь приведены некоторые значения, которые можно использовать для экранов обычных размеров:</p>
389 <ul>
390 <li>320 для устройств с конфигурациями экрана:
391 <ul>
392 <li>240x320 ldpi (смартфон QVGA)</li>
393 <li>320x480 mdpi (смартфон)</li>
394 <li>480x800 hdpi (смартфон высокой плотности)</li>
395 </ul>
396 </li>
397 <li>480 для таких экранов, как 480x800 mdpi (планшет/смартфон).</li>
398 <li>600 для таких экранов, как 600x1024 mdpi (планшет с диагональю 7").</li>
399 <li>720 для таких экранов, как 720x1280 mdpi (планшет с диагональю 10").</li>
400 </ul>
401 <p>Когда приложение предоставляет несколько каталогов ресурсов с разными значениями
402квалификатора «минимальная ширина», система использует квалификатор, ближайший
403к минимальной ширине устройства, но не превышающий ее. </p>
404 <p><em>Добавлено в API уровня 13.</em></p>
405 <p>См. также атрибут <a href="{@docRoot}guide/topics/manifest/supports-screens-element.html#requiresSmallest">{@code
406android:requiresSmallestWidthDp}</a>, который объявляет минимальную ширину, совместимую
407с вашим приложением, и поле конфигурации {@link
408android.content.res.Configuration#smallestScreenWidthDp}, которое содержит значение
409минимальной ширины устройства.</p>
410 <p>Дополнительную информацию о разработке для различных экранов и использовании этого
411квалификатора см. в руководстве разработчика <a href="{@docRoot}guide/practices/screens_support.html">Поддержка
412нескольких экранов</a>.</p>
413 </td>
414 </tr>
415 <tr id="ScreenWidthQualifier">
416 <td>Доступная ширина</td>
417 <td><code>w&lt;N&gt;dp</code><br/><br/>
418 Примеры:<br/>
419 <code>w720dp</code><br/>
420 <code>w1024dp</code><br/>
421 и т. д.
422 </td>
423 <td>
424 <p>Указывает минимальную доступную ширину экрана в единицах {@code dp}, для которой должен использоваться ресурс,
425заданный значением <code>&lt;N&gt;</code>. Это
426значение конфигурации будет изменяться в соответствии с текущей фактической шириной
427при изменении альбомной/книжной ориентации.</p>
428 <p>Когда приложение предоставляет несколько каталогов ресурсов с разными значениями
429этой конфигурации, система использует ширину, ближайшую к текущей
430ширине экрана устройства, но не превышающую ее. Это значение
431учитывает оформление экрана, поэтому, если устройство содержит
432постоянные элементы пользовательского интерфейса вдоль левого или правого края дисплея, оно
433использует значение ширины, которое меньше реального размера экрана: эти элементы
434пользовательского интерфейса учитываются и уменьшают пространство, доступное для приложения.</p>
435 <p><em>Добавлено в API уровня 13.</em></p>
436 <p>См. также поле конфигурации {@link android.content.res.Configuration#screenWidthDp}
437, которое содержит текущую ширину экрана.</p>
438 <p>Дополнительную информацию о разработке для различных экранов и использовании этого
439квалификатора см. в руководстве разработчика <a href="{@docRoot}guide/practices/screens_support.html">Поддержка
440нескольких экранов</a>.</p>
441 </td>
442 </tr>
443 <tr id="ScreenHeightQualifier">
444 <td>Доступная высота</td>
445 <td><code>h&lt;N&gt;dp</code><br/><br/>
446 Примеры:<br/>
447 <code>h720dp</code><br/>
448 <code>h1024dp</code><br/>
449 и т. д.
450 </td>
451 <td>
452 <p>Указывает минимальную доступную высоту экрана в пикселах, для которой должен использоваться ресурс,
453заданный значением <code>&lt;N&gt;</code>. Это
454значение конфигурации будет изменяться в соответствии с текущей фактической высотой
455при изменении альбомной/книжной ориентации.</p>
456 <p>Когда приложение предоставляет несколько каталогов ресурсов с разными значениями
457этой конфигурации, система использует высоту, ближайшую к текущей
458высоте экрана устройства, но не превышающую ее. Это значение
459учитывает оформление экрана, поэтому, если устройство содержит
460постоянные элементы пользовательского интерфейса вдоль верхнего или нижнего края дисплея, оно
461использует значение высоты, которое меньше реального размера экрана: эти элементы
462пользовательского интерфейса учитываются и уменьшают пространство, доступное для приложения. Элементы оформления
463экрана, которые не являются постоянными (например, строка состояния телефона может быть
464скрыта в полноэкранном режиме), здесь <em>не</em> учитываются; также не учитываются такие элементы
465оформления окна, как строка заголовка или строка действий, поэтому приложения должны быть готовы к работе с меньшим
466пространством, чем указано.
467 <p><em>Добавлено в API уровня 13.</em></p>
468 <p>См. также поле конфигурации {@link android.content.res.Configuration#screenHeightDp}
469, которое содержит текущую ширину экрана.</p>
470 <p>Дополнительную информацию о разработке для различных экранов и использовании этого
471квалификатора см. в руководстве разработчика <a href="{@docRoot}guide/practices/screens_support.html">Поддержка
472нескольких экранов</a>.</p>
473 </td>
474 </tr>
475 <tr id="ScreenSizeQualifier">
476 <td>Размер экрана</td>
477 <td>
478 <code>small</code><br/>
479 <code>normal</code><br/>
480 <code>large</code><br/>
481 <code>xlarge</code>
482 </td>
483 <td>
484 <ul class="nolist">
485 <li>{@code small}: Экраны, подобные по размеру
486экрану QVGA низкой плотности. Минимальный размер макета для маленького экрана
487составляет приблизительно 320x426 пикселов. Примерами являются экраны QVGA низкой плотности и VGA высокой
488плотности.</li>
489 <li>{@code normal}: Экраны, подобные по размеру
490экрану HVGA средней плотности. Минимальный
491размер макета для нормального экрана составляет приблизительно 320x470 пикселов. Примерами таких экранов
492являются экраны WQVGA низкой плотности, HVGA средней плотности, WVGA
493высокой плотности.</li>
494 <li>{@code large}: Экраны, подобные по размеру
495экрану VGA средней плотности.
496 Минимальный размер макета для большого экрана составляет приблизительно 480x640 пикселов.
497 Примерами являются экраны VGA и WVGA средней плотности.</li>
Mark Luc4a01392016-07-18 10:42:11 -0700498 <li>{@code xlarge}: Экраны значительно крупнее обычного
Trevor Johns682c24e2016-04-12 10:13:47 -0700499экрана HVGA средней плотности. Минимальный размер макета для очень большого экрана составляет
500приблизительно 720x960 пикселов. В большинстве случаев устройства с очень большими
501экранами слишком велики для карманного использования и, скорее всего,
502относятся к планшетам. <em>Добавлено в API уровня 9.</em></li>
503 </ul>
504 <p class="note"><strong>Примечание.</strong> Использование квалификатора размера не подразумевает, что
505ресурсы предназначены <em>только</em> для экранов этого размера. Если не предусмотрены
506альтернативные ресурсы с квалификаторами, лучше подходящими к текущей конфигурации устройства, система может использовать
507любые <a href="#BestMatch">наиболее подходящие</a> ресурсы.</p>
508 <p class="caution"><strong>Предупреждение!</strong> Если все ресурсы используют квалификатор размера,
509который <em>превосходит</em> размер текущего экрана, система <strong>не</strong> будет использовать эти ресурсы, и приложение
510аварийно завершится во время выполнения (например, если все ресурсы макета отмечены квалификатором {@code
511xlarge}, но устройство оснащено экраном нормального размера).</p>
512 <p><em>Добавлено в API уровня 4.</em></p>
Mark Luc4a01392016-07-18 10:42:11 -0700513
Trevor Johns682c24e2016-04-12 10:13:47 -0700514 <p>Дополнительную информацию см. в разделе <a href="{@docRoot}guide/practices/screens_support.html">Поддержка нескольких
515экранов</a>.</p>
516 <p>См. также поле конфигурации {@link android.content.res.Configuration#screenLayout}, которое
517указывает тип размера экрана: маленький, нормальный
518или большой.</p>
519 </td>
520 </tr>
521 <tr id="ScreenAspectQualifier">
522 <td>Формат экрана</td>
523 <td>
524 <code>long</code><br/>
525 <code>notlong</code>
526 </td>
527 <td>
528 <ul class="nolist">
529 <li>{@code long}: Длинные экраны, такие как WQVGA, WVGA, FWVGA</li>
530 <li>{@code notlong}: Недлинные экраны, такие как QVGA, HVGA и VGA</li>
531 </ul>
532 <p><em>Добавлено в API уровня 4.</em></p>
533 <p>Формат основан исключительно на соотношении сторон экрана («длинный» экран шире). Это
534не связано с ориентацией экрана.</p>
535 <p>См. также поле конфигурации {@link android.content.res.Configuration#screenLayout}, которое
536указывает, является ли экран длинным.</p>
537 </td>
538 </tr>
539 <tr id="OrientationQualifier">
540 <td>Ориентация экрана</td>
541 <td>
542 <code>port</code><br/>
543 <code>land</code> <!-- <br/>
544 <code>square</code> -->
545 </td>
546 <td>
547 <ul class="nolist">
548 <li>{@code port}: Устройство в портретной (вертикальной) ориентации</li>
549 <li>{@code land}: Устройство в книжной (горизонтальной) ориентации</li>
550 <!-- Square mode is currently not used. -->
551 </ul>
552 <p>Ориентация может измениться за время работы приложения, если
553пользователь поворачивает экран. В разделе <a href="runtime-changes.html">Обработка изменений в режиме выполнения</a> содержится информация
554о воздействии таких изменений на приложение во время выполнения.</p>
555 <p>См. также поле конфигурации {@link android.content.res.Configuration#orientation}, которое
556указывает текущую ориентацию устройства.</p>
557 </td>
558 </tr>
559 <tr id="UiModeQualifier">
560 <td>Режим пользовательского интерфейса</td>
561 <td>
562 <code>car</code><br/>
563 <code>desk</code><br/>
564 <code>television</code><br/>
565 <code>appliance</code>
566 <code>watch</code>
567 </td>
568 <td>
569 <ul class="nolist">
570 <li>{@code car}: Устройство подсоединено к автомобильной док-станции</li>
571 <li>{@code desk}: Устройство подсоединено к настольной док-станции</li>
572 <li>{@code television}: Устройство подсоединено к телевизору, обеспечивая
573взаимодействие с расстояния «три метра», когда пользовательский интерфейс находится на большом экране,
574находящемся вдалеке от пользователя, ориентированное на управление с помощью навигационной клавиши или другого
575устройства без указателя</li>
576 <li>{@code appliance}: Устройство служит в качестве прибора без
577дисплея</li>
578 <li>{@code watch}: Устройство с дисплеем для ношения на запястье</li>
579 </ul>
580 <p><em>Добавлено в API уровня 8, телевизор добавлен в API 13, часы добавлены в API 20.</em></p>
581 <p>Информацию о том, как приложение может реагировать на установку устройства в
582док-станцию или извлечение из нее, прочитайте документ <a href="{@docRoot}training/monitoring-device-state/docking-monitoring.html">Определение
583и мониторинг типа и состояния подключения к док-станции</a>.</p>
584 <p>Подключение может измениться за время работы приложения, если пользователь помещает устройство
585в док-станцию. Некоторые из этих режимов можно включить или отключить с помощью {@link
586android.app.UiModeManager}. В разделе <a href="runtime-changes.html">Обработка изменений в режиме выполнения</a> содержится
587информация о воздействии таких изменений на приложение во время выполнения.</p>
588 </td>
589 </tr>
590 <tr id="NightQualifier">
591 <td>Ночной режим</td>
592 <td>
593 <code>night</code><br/>
594 <code>notnight</code>
595 </td>
596 <td>
597 <ul class="nolist">
598 <li>{@code night}: Ночное время</li>
599 <li>{@code notnight}: Дневное время</li>
600 </ul>
601 <p><em>Добавлено в API уровня 8.</em></p>
602 <p>Этот режим может измениться за время работы, если ночной режим оставлен в
603автоматическом режиме (по умолчанию), в котором режим изменяется в зависимости от времени суток. Этот режим можно включить
604или отключить с помощью {@link android.app.UiModeManager}. В разделе <a href="runtime-changes.html">Обработка изменений в режиме выполнения</a> содержится информация о воздействии таких
605изменений на приложение во время выполнения.</p>
606 </td>
607 </tr>
608 <tr id="DensityQualifier">
609 <td>Плотность пикселов на экране (dpi)</td>
610 <td>
611 <code>ldpi</code><br/>
612 <code>mdpi</code><br/>
613 <code>hdpi</code><br/>
614 <code>xhdpi</code><br/>
615 <code>xxhdpi</code><br/>
616 <code>xxxhdpi</code><br/>
617 <code>nodpi</code><br/>
618 <code>tvdpi</code>
619 </td>
620 <td>
621 <ul class="nolist">
622 <li>{@code ldpi}: Экраны низкой плотности; приблизительно 120 dpi.</li>
623 <li>{@code mdpi}: Экраны средней плотности (обычные HVGA); приблизительно
624160 dpi.</li>
625 <li>{@code hdpi}: Экраны высокой плотности; приблизительно 240 dpi.</li>
626 <li>{@code xhdpi}: Экраны очень высокой плотности; приблизительно 320 dpi. <em>Добавлено в API
627уровня 8.</em></li>
628 <li>{@code xxhdpi}: Экраны сверхвысокой плотности; приблизительно 480 dpi. <em>Добавлено в API
629уровня 16.</em></li>
630 <li>{@code xxxhdpi}: Использование исключительно высокой плотности (только значок запуска, см.
631<a href="{@docRoot}guide/practices/screens_support.html#xxxhdpi-note">примечание</a>
632в документе <em>Поддержка нескольких экранов</em>); приблизительно 640 dpi. <em>Добавлено в API
633уровня 18.</em></li>
634 <li>{@code nodpi}: Этот режим можно использовать для растровых графических ресурсов, которые не требуется масштабировать
635в соответствии с плотностью устройства.</li>
636 <li>{@code tvdpi}: Экраны промежуточной плотности между mdpi и hdpi; приблизительно 213 dpi. Этот режим не считается
637«основной» группой плотности. Он главным образом предназначен для телевизоров, и большинство
638приложений в нем не нуждается &mdash; при условии, что ресурсов mdpi и hdpi достаточно для большинства приложений, и
639система будет масштабировать их при необходимости. Этот квалификатор введен в API уровня 13.</li>
640 </ul>
641 <p>Шесть основных уровней плотности соотносятся как 3:4:6:8:12:16 (если игнорировать
642плотность tvdpi). Так, растровое изображение 9x9 в ldpi представляется как 12x12 в mdpi, 18x18 в hdpi, 24x24 в xhdpi и т. д.
643</p>
644 <p>Если графические ресурсы выглядят недостаточно хорошо на телевизоре или
645других определенных устройствах, и хочется попробовать ресурсы tvdpi, используйте масштабный коэффициент 1,33*mdpi. Например,
646 изображение 100 x 100 пикселов для экранов mdpi должно иметь размер 133 x 133 пиксела для tvdpi.</p>
647 <p class="note"><strong>Примечание.</strong> Использование квалификатора плотности не подразумевает, что
648ресурсы предназначены <em>только</em> для экранов этой плотности. Если не предусмотрены
649альтернативные ресурсы с квалификаторами, лучше подходящими к текущей конфигурации устройства, система может использовать
650любые <a href="#BestMatch">наиболее подходящие</a> ресурсы.</p>
651 <p>Дополнительную информацию о том, как обрабатывать
652различные плотности экранов, и как Android может масштабировать растровые изображения в соответствии текущей плотностью, см. в разделе <a href="{@docRoot}guide/practices/screens_support.html">Поддержка нескольких
653экранов</a>.</p>
654 </td>
655 </tr>
656 <tr id="TouchscreenQualifier">
657 <td>Тип сенсорного экрана</td>
658 <td>
659 <code>notouch</code><br/>
660 <code>finger</code>
661 </td>
662 <td>
663 <ul class="nolist">
664 <li>{@code notouch}: Устройство не оснащено сенсорным экраном.</li>
665 <li>{@code finger}: Устройство оснащено сенсорным экраном, предназначенным
666для ввода с помощью пальцев пользователя.</li>
667 </ul>
668 <p>См. также поле конфигурации {@link android.content.res.Configuration#touchscreen}, которое
669указывает тип сенсорного экрана устройства.</p>
670 </td>
671 </tr>
672 <tr id="KeyboardAvailQualifier">
673 <td>Доступность клавиатуры</td>
674 <td>
675 <code>keysexposed</code><br/>
676 <code>keyshidden</code><br/>
677 <code>keyssoft</code>
678 </td>
679 <td>
680 <ul class="nolist">
681 <li>{@code keysexposed}: В устройстве доступна клавиатура. Если в устройстве включена
682экранная клавиатура (что весьма вероятно), она может использоваться даже в случае, когда аппаратная клавиатура
683<em></em> недоступна пользователю, даже если устройство не имеет аппаратной клавиатуры. Если экранная
684клавиатура отсутствует или отключена, это квалификатор используется только в том случае, когда доступна
685аппаратная клавиатура.</li>
686 <li>{@code keyshidden}: Устройство имеет аппаратную клавиатуру, но она
687скрыта, <em>и </em> в устройстве <em>не</em> включена экранная клавиатура.</li>
688 <li>{@code keyssoft}: Экранная клавиатура в устройстве включена независимо от того,
689видна она или нет.</li>
690 </ul>
691 <p>Если предоставляются ресурсы <code>keysexposed</code>, но не предоставляются ресурсы <code>keyssoft</code>,
692система использует ресурсы <code>keysexposed</code> независимо от видимости
693клавиатуры, поскольку в системе включена экранная клавиатура.</p>
694 <p>Это состояние может измениться за время работы приложения, если
695пользователь открывает аппаратную клавиатуру. В разделе <a href="runtime-changes.html">Обработка изменений в режиме выполнения</a> содержится информация о воздействии таких
696изменений на приложение во время выполнения.</p>
697 <p>См. также поля конфигурации {@link
698android.content.res.Configuration#hardKeyboardHidden} и {@link
699android.content.res.Configuration#keyboardHidden}, которые указывают видимость аппаратной
700клавиатуры и видимость клавиатуры любого типа (включая экранную), соответственно.</p>
701 </td>
702 </tr>
703 <tr id="ImeQualifier">
704 <td>Основной способ ввода текста</td>
705 <td>
706 <code>nokeys</code><br/>
707 <code>qwerty</code><br/>
708 <code>12key</code>
709 </td>
710 <td>
711 <ul class="nolist">
712 <li>{@code nokeys}: В устройстве отсутствуют аппаратные клавиши для ввода текста.</li>
713 <li>{@code qwerty}: Устройство оснащено аппаратной клавиатурой с раскладкой qwerty, независимо от того, видна она
714пользователю
715или нет.</li>
716 <li>{@code 12key}: Устройство оснащено аппаратной клавиатурой с 12 клавишами, независимо от того, видна она пользователю
717или нет.</li>
718 </ul>
719 <p>См. также поле конфигурации {@link android.content.res.Configuration#keyboard}, которое
720указывает основной доступный способ ввода текста.</p>
721 </td>
722 </tr>
723 <tr id="NavAvailQualifier">
724 <td>Доступность клавиш перемещения</td>
725 <td>
726 <code>navexposed</code><br/>
727 <code>navhidden</code>
728 </td>
729 <td>
730 <ul class="nolist">
731 <li>{@code navexposed}: Клавиши перемещения доступны пользователю.</li>
732 <li>{@code navhidden}: Клавиши перемещения недоступны (например, находятся за
733закрытой крышкой).</li>
734 </ul>
735 <p>Это состояние может измениться за время работы приложения, если
736пользователь открывает клавиши перемещения. В разделе <a href="runtime-changes.html">Обработка изменений в режиме выполнения</a> содержится
737информация о воздействии таких изменений на приложение во время выполнения.</p>
738 <p>См. также поле конфигурации {@link android.content.res.Configuration#navigationHidden}, которое
739указывает, скрыты ли клавиши перемещения.</p>
740 </td>
741 </tr>
742 <tr id="NavigationQualifier">
743 <td>Основной несенсорный способ перемещения курсора</td>
744 <td>
745 <code>nonav</code><br/>
746 <code>dpad</code><br/>
747 <code>trackball</code><br/>
748 <code>wheel</code>
749 </td>
750 <td>
751 <ul class="nolist">
752 <li>{@code nonav}: Устройство не оснащено другими средствами перемещения курсора, кроме
753сенсорного экрана.</li>
754 <li>{@code dpad}: Устройство оснащено навигационной клавишей.</li>
755 <li>{@code trackball}: Устройство оснащено трекболом.</li>
756 <li>{@code wheel}: Устройство оснащено навигационным колесиком (редко).</li>
757 </ul>
758 <p>См. также поле конфигурации {@link android.content.res.Configuration#navigation}, которое
759указывает способ перемещения курсора.</p>
760 </td>
761 </tr>
762<!-- DEPRECATED
763 <tr>
764 <td>Screen dimensions</td>
765 <td>Examples:<br/>
766 <code>320x240</code><br/>
767 <code>640x480</code><br/>
768 etc.
769 </td>
770 <td>
771 <p>The larger dimension must be specified first. <strong>This configuration is deprecated
772and should not be used</strong>. Instead use "screen size," "wider/taller screens," and "screen
773orientation" described above.</p>
774 </td>
775 </tr>
776-->
777 <tr id="VersionQualifier">
778 <td>Версия платформы (уровень API)</td>
779 <td>Примеры:<br/>
780 <code>v3</code><br/>
781 <code>v4</code><br/>
782 <code>v7</code><br/>
783 и т. д.</td>
784 <td>
785 <p>Уровень API, поддерживаемый устройством. Например, <code>v1</code> для уровня API
7861 (устройства с Android 1.0 или выше) и <code>v4</code> для уровня API 4 (устройства с Android
7871.6 или выше). В документе <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">Уровни API Android</a> содержится дополнительная информация
788об этих значениях.</p>
789 </td>
790 </tr>
791</table>
792
793
794<p class="note"><strong>Примечание.</strong> Некоторые квалификаторы конфигурации добавлены после версии Android
7951.0, поэтому в некоторых версиях Android поддерживаются не все квалификаторы. При использовании нового квалификатора косвенно
796добавляется квалификатор версии платформы, чтобы более старые устройства игнорировали его. Например, при использовании
797квалификатора <code>w600dp</code> автоматически добавляется квалификатор <code>v13</code>, так как квалификатор
798доступной ширины был новым в API уровня 13. Чтобы исключить какие-либо проблемы, всегда включайте набор
799ресурсов по умолчанию (набор ресурсов <em>без квалификаторов</em>). Для получения дополнительной информации см.
800раздел <a href="#Compatibility">Обеспечение оптимальной совместимости устройства с
801ресурсами</a>.</p>
802
803
804
805<h3 id="QualifierRules">Правила квалификатора имени</h3>
806
807<p>Здесь приведены некоторые правила использования имен квалификаторов:</p>
808
809<ul>
810 <li>Можно указать несколько квалификаторов для одного набора ресурсов, разделяя их дефисами. Например,
811 <code>drawable-en-rUS-land</code> применяется к устройствам в США, на английском языке в альбомной
812ориентации.</li>
813 <li>Квалификаторы должны идти в том же порядке, в котором они перечислены в <a href="#table2">таблице 2</a>. Например:
814
815 <ul>
816 <li>Неправильно: <code>drawable-hdpi-port/</code></li>
817 <li>Правильно: <code>drawable-port-hdpi/</code></li>
818 </ul>
819 </li>
820 <li>Нельзя использовать вложенные каталоги альтернативных ресурсов. Например, нельзя иметь каталог
821<code>res/drawable/drawable-en/</code>.</li>
822 <li>Значения не зависят от регистра букв. Компилятор ресурсов преобразует имена каталогов
823в нижний регистр перед обработкой, чтобы избежать проблем в файловых системах,
824не учитывающих регистр. Прописные буквы в именах служат исключительно для удобочитаемости.</li>
825 <li>Поддерживается только одно значение квалификатора каждого типа. Например, если требуется использовать
826одинаковые графические файлы для испанского и французского языков, <em>нельзя</em> создавать
827каталог с именем <code>drawable-rES-rFR/</code>. Вместо этого необходимо создать два каталога ресурсов, например,
828<code>drawable-rES/</code> и <code>drawable-rFR/</code>, которые содержат соответствующие файлы.
829Однако не обязательно фактически копировать одинаковые файлы в оба каталога. Вместо этого
830можно создать псевдоним для ресурса. См. раздел <a href="#AliasResources">Создание
831псевдонимов ресурсов</a> ниже.</li>
832</ul>
833
834<p>После сохранения альтернативных ресурсов в каталоги с именами
835этих квалификаторов Android автоматически применяет ресурсы в приложении на основе текущей конфигурации
836устройства. При каждом запросе ресурсов Android проверяет каталоги альтернативных
837ресурсов, которые содержат файл запрошенного ресурса, затем <a href="#BestMatch">находят
838наиболее подходящий ресурс</a> (обсуждается ниже). Если нет альтернативных ресурсов, которые
839соответствуют конкретной конфигурации устройства, Android использует ресурсы по умолчанию (набор
840ресурсов для конкретного типа ресурсов, которые не содержат квалификатора
841конфигурации).</p>
842
843
844
845<h3 id="AliasResources">Создание псевдонимов ресурсов</h3>
846
847<p>Ресурс, предназначенный для нескольких конфигураций
848устройства (но не являющийся ресурсом по умолчанию), следует помещать
849только в один каталог альтернативных ресурсов. Вместо этого можно некоторых случаях) создать
850альтернативный
851ресурс, действующий в качестве псевдонима для ресурса, сохраненного в каталоге ресурсов по умолчанию.</p>
852
853<p class="note"><strong>Примечание.</strong> Не все ресурсы предлагают механизм, позволяющий
854создавать псевдоним для другого ресурса. В частности, анимации, меню, необработанные и другие неустановленные
855ресурсы в каталоге {@code xml/} не содержат такой возможности.</p>
856
857<p>Например, представьте, что имеется значок приложения, {@code icon.png}, и требуется иметь уникальные версии
858этого значка для разных языков. Однако в двух языках, канадском английском и канадском французском, требуется
859использовать одинаковую версию. Можно предположить, что требуется скопировать одно изображение
860в каталоги ресурсов для обоих языков, но
861это неверно. Вместо этого можно сохранить изображение для обоих языков, как {@code icon_ca.png} (любое
862имя, кроме {@code icon.png}), и поместить его
863в каталог по умолчанию {@code res/drawable/}. Затем создайте файл {@code icon.xml} в каталогах {@code
864res/drawable-en-rCA/} и {@code res/drawable-fr-rCA/} который ссылается на ресурс {@code icon_ca.png}
865с помощью элемента {@code &lt;bitmap&gt;}. Это позволяет хранить только одну версию файла PNG
866и два маленьких файла XML, которые указывают на него. (Пример файла XML показан ниже.)</p>
867
868
869<h4>Графические объекты</h4>
870
871<p>Чтобы создать псевдоним для существующего графического объекта, используйте элемент {@code &lt;bitmap&gt;}.
872Например:</p>
873
874<pre>
875&lt;?xml version="1.0" encoding="utf-8"?>
876&lt;bitmap xmlns:android="http://schemas.android.com/apk/res/android"
877 android:src="@drawable/icon_ca" />
878</pre>
879
880<p>Если сохранить этот файл под именем {@code icon.xml} каталоге альтернативных ресурсов, например,
881{@code res/drawable-en-rCA/}), он компилируется в ресурс, на который
882можно ссылаться с помощью {@code R.drawable.icon}, но фактически он является псевдонимом для ресурса {@code
883R.drawable.icon_ca} (который сохранен в каталоге {@code res/drawable/}).</p>
884
885
886<h4>Макет</h4>
887
888<p>Чтобы создать псевдоним для существующего макета, используйте элемент {@code &lt;include&gt;}
889, заключенный в теги {@code &lt;merge&gt;}. Например:</p>
890
891<pre>
892&lt;?xml version="1.0" encoding="utf-8"?>
893&lt;merge>
894 &lt;include layout="@layout/main_ltr"/>
895&lt;/merge>
896</pre>
897
898<p>Если сохранить этот файл под именем {@code main.xml}, он компилируется в ресурс, на который можно ссылаться
899с помощью {@code R.layout.main}, но фактически он является псевдонимом для ресурса {@code R.layout.main_ltr}
900.</p>
901
902
903<h4>Строки и другие простые значения</h4>
904
905<p>Чтобы создать псевдоним для существующей строки используйте идентификатор ресурса нужной
906строки в качестве значения для новой строки. Например:</p>
907
908<pre>
909&lt;?xml version="1.0" encoding="utf-8"?>
910&lt;resources>
911 &lt;string name="hello">Hello&lt;/string>
912 &lt;string name="hi">@string/hello&lt;/string>
913&lt;/resources>
914</pre>
915
916<p>Ресурс {@code R.string.hi} теперь является псевдонимом для {@code R.string.hello}.</p>
917
918<p> <a href="{@docRoot}guide/topics/resources/more-resources.html">Другие простые значения</a> работают
919аналогично. Например, цвет:</p>
920
921<pre>
922&lt;?xml version="1.0" encoding="utf-8"?>
923&lt;resources>
924 &lt;color name="yellow">#f00&lt;/color>
925 &lt;color name="highlight">@color/red&lt;/color>
926&lt;/resources>
927</pre>
928
929
930
931
932<h2 id="Compatibility">Обеспечение оптимальной совместимости устройства с ресурсами</h2>
933
934<p>Для того чтобы приложение поддерживало несколько конфигураций устройств, очень важно
935всегда предоставлять ресурсы по умолчанию для каждого типа ресурсов, используемых приложением.</p>
936
937<p>Например, если приложение поддерживает несколько языков, всегда включайте каталог {@code
938values/} котором сохранены строки) <em>без</em> <a href="#LocaleQualifier">квалификатора языка и региона</a>. Если вместо этого поместить все файлы строк
939в каталоги с квалификаторами языка и региона, приложение закроется с ошибкой при запуске
940на устройстве, на котором установлен язык, отсутствующий в ваших строках. Но как только вы предоставили ресурсы
941{@code values/} по умолчанию, приложение будет работать правильно (даже если пользователь не
942понимает этого языка, это лучше, чем завершение с ошибкой).</p>
943
944<p>Таким же образом, если вы предоставляете различные ресурсы макета в зависимости от ориентации экрана, следует
945указать одну ориентацию в качестве ориентации по умолчанию. Например, вместо предоставления ресурсов макета в каталоге {@code
946layout-land/} для альбомной ориентации и в каталоге {@code layout-port/} для книжной ориентации, оставьте один вариант по умолчанию: например,
947{@code layout/} для альбомной и {@code layout-port/} для книжной ориентации.</p>
948
949<p>Предоставление ресурсов по умолчанию важно не только потому, что приложение сможет работать на конфигурации,
950которую вы не предусмотрели, но также и потому, что новые версии Android иногда добавляют
951квалификаторы конфигураций, которые не поддерживаются более старыми версиями. Если вы используете новый квалификатор ресурсов,
952но поддерживаете совместимость кода с более старыми версиями Android, то при выполнении вашего приложения в более старой версии
953Android оно завершится в ошибкой, если вы не предусмотрели ресурсы по умолчанию, так как
954оно не может использовать ресурсы, проименованные новым квалификатором. Например, если для параметра <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code
955minSdkVersion}</a> установлено значение 4 и вы квалифицировали все графические ресурсы с использованием <a href="#NightQualifier">ночного режима</a> ({@code night} или {@code notnight}, который был добавлен в API
956уровня 8), то устройства с API уровня 4 не смогут получить доступ к графическим ресурсам и приложение завершится с ошибкой. В этом
957случае, вероятно, следует использовать {@code notnight} в качестве ресурсов по умолчанию и исключить этот
958квалификатор, разместив графические ресурсы в каталогах {@code drawable/} или {@code drawable-night/}.</p>
959
960<p>Поэтому для обеспечения оптимальной совместимости с устройствами обязательно предоставляйте ресурсы
961по умолчанию, которые приложение может правильно выполнять. Затем создайте альтернативные
962ресурсы для определенных конфигураций устройств с помощью квалификаторов конфигурации.</p>
963
964<p>Из этого правила есть одно исключение: Если в приложении для параметра <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> установлено значение 4 или
965выше, <em>не требуется</em> предоставлять графические ресурсы по умолчанию при предоставлении альтернативных графических
966ресурсов с квалификатором <a href="#DensityQualifier">плотность экрана</a>. Даже без графических ресурсов
967по умолчанию Android может найти наиболее подходящую альтернативную плотность экрана и масштабировать
968растровые изображения при необходимости. Однако для оптимальной работы на устройствах всех типов следует
969предоставить альтернативные графические ресурсы для всех трех типов плотности.</p>
970
971
972
973<h2 id="BestMatch">Как Android находит наиболее подходящий ресурс</h2>
974
975<p>Когда вы запрашиваете ресурс, для которого предоставлена альтернатива, Android выбирает
976альтернативный ресурс для использования в режиме выполнения в зависимости от текущей конфигурации устройства. Чтобы
977продемонстрировать, как Android выбирает альтернативный ресурс, допустим, что имеются следующие каталоги графических ресурсов,
978каждый из которых содержит различные версии одинаковых изображений:</p>
979
980<pre class="classic no-pretty-print">
981drawable/
982drawable-en/
983drawable-fr-rCA/
984drawable-en-port/
985drawable-en-notouch-12key/
986drawable-port-ldpi/
987drawable-port-notouch-12key/
988</pre>
989
990<p>И допустим, что устройство имеет следующую конфигурацию:</p>
991
992<p style="margin-left:1em;">
993Язык = <code>en-GB</code> <br/>
994Ориентация экрана = <code>port</code> <br/>
995Плотность пикселов на экране = <code>hdpi</code> <br/>
996Тип сенсорного экрана = <code>notouch</code> <br/>
997Основной способ ввода текста = <code>12key</code>
998</p>
999
1000<p>Сравнивая конфигурацию устройства с доступными альтернативными ресурсами, Android выбирает
1001графику из каталога {@code drawable-en-port}.</p>
1002
1003<p>Система приходит к решению об используемых ресурсах на основе следующей
1004логики:</p>
1005
1006
1007<div class="figure" style="width:371px">
1008<img src="{@docRoot}images/resources/res-selection-flowchart.png" alt="" height="471" />
1009<p class="img-caption"><strong>Рисунок 2.</strong> Как Android находит наиболее подходящий ресурс.
1010Структурная схема.</p>
1011</div>
1012
1013
1014<ol>
1015 <li>Исключение файлов ресурсов, которые противоречат конфигурации устройства.
1016 <p>Каталог <code>drawable-fr-rCA/</code> исключается, так как он
1017противоречит языку <code>en-GB</code>.</p>
1018<pre class="classic no-pretty-print">
1019drawable/
1020drawable-en/
1021<strike>drawable-fr-rCA/</strike>
1022drawable-en-port/
1023drawable-en-notouch-12key/
1024drawable-port-ldpi/
1025drawable-port-notouch-12key/
1026</pre>
1027<p class="note"><strong>Исключение.</strong> Квалификатор плотности пикселов на экране не исключается
1028вследствие противоречия. Хотя плотность экрана устройства hdpi,
1029каталог <code>drawable-port-ldpi/</code> не исключается, так как на этом этапе любая плотность экрана
1030считается подходящей. Более подробная информация доступна в документе <a href="{@docRoot}guide/practices/screens_support.html">Поддержка нескольких
1031экранов</a>.</p></li>
1032
1033 <li>Указание (следующего) квалификатора с высшим приоритетом в списке (<a href="#table2">таблица 2</a>).
1034(Начать с MCC, затем двигаться вниз.) </li>
1035 <li>Содержат ли какие-либо каталоги ресурсов этот квалификатор? </li>
1036 <ul>
1037 <li>Если Нет, вернуться к шагу 2 и найти следующий квалификатор. нашем примере
1038получается ответ «нет», пока не достигнут квалификатор языка.)</li>
1039 <li>Если Да, перейти к шагу 4.</li>
1040 </ul>
1041 </li>
1042
1043 <li>Исключить каталоги ресурсов, которые не содержат этого квалификатора. В данном примере система исключает
1044все каталоги, которые не содержат квалификатора языка:</li>
1045<pre class="classic no-pretty-print">
1046<strike>drawable/</strike>
1047drawable-en/
1048drawable-en-port/
1049drawable-en-notouch-12key/
1050<strike>drawable-port-ldpi/</strike>
1051<strike>drawable-port-notouch-12key/</strike>
1052</pre>
1053<p class="note"><strong>Исключение.</strong> Если получен квалификатор плотности пикселов на экране,
1054Android выбирает вариант, наиболее близко соответствующий плотности экрана устройства.
1055Как правило, Android предпочитает уменьшать большие исходные изображения, чем увеличивать
1056мелкие. См. раздел <a href="{@docRoot}guide/practices/screens_support.html">Поддержка нескольких
1057экранов</a>.</p>
1058 </li>
1059
1060 <li>Вернуться и повторять шаги 2, 3 и 4, пока не останется только один каталог. В нашем примере следующим
1061квалификатором, для которого есть совпадения, является ориентация экрана.
1062Поэтому исключаются ресурсы, не указывающие ориентацию экрана:
1063<pre class="classic no-pretty-print">
1064<strike>drawable-en/</strike>
1065drawable-en-port/
1066<strike>drawable-en-notouch-12key/</strike>
1067</pre>
1068<p>Остается каталог {@code drawable-en-port}.</p>
1069 </li>
1070</ol>
1071
1072<p>Хотя эта процедура выполняется для каждого запрошенного ресурса, система дополнительно оптимизирует
1073некоторые вопросы. Одна из таких оптимизаций состоит в том, что поскольку конфигурация устройства известна, можно
1074исключить альтернативные ресурсы, которые не могут подойти. Например, если используется конфигурация с английским
1075языком ("en"), все каталоги ресурсов, для которых установлен другой квалификатор языка,
1076никогда не включаются в пул проверяемых ресурсов (хотя
1077каталоги ресурсов <em>без</em> квалификатора языка включаются).</p>
1078
1079<p>При выборе ресурсов на основе квалификаторов размера экрана система будет использовать ресурсы
1080предназначенные для экрана, меньшего чем текущий экран, если нет более подходящих ресурсов
1081(например, на экранах большого размера при необходимости будут использоваться ресурсы, предназначенные для экранов нормального размера). Однако, если
1082 единственные доступные ресурсы <em>превосходят</em> размер текущего экрана, система
1083<strong>не</strong> будет использовать эти ресурсы, и приложение аварийно завершится, если нет других ресурсов, соответствующих конфигурации
1084устройства (например, если все ресурсы макета отмечены квалификатором {@code xlarge},
1085но устройство оснащено экраном нормального размера).</p>
1086
1087<p class="note"><strong>Примечание.</strong> <em>Приоритет</em> квалификатора <a href="#table2">таблице 2</a>) более важен,
1088чем число квалификаторов, которые точно соответствуют устройству. Например, на шаге 4 выше, последний
1089вариант в списке содержит три квалификатора, которые точно соответствуют устройству (ориентация, тип
1090сенсорного экрана и способ ввода), в то время как <code>drawable-en</code> содержит только один подходящий параметр
Mark Luc4a01392016-07-18 10:42:11 -07001091(язык). Однако язык имеет более высокий приоритет, чем эти остальные квалификаторы, поэтому
Trevor Johns682c24e2016-04-12 10:13:47 -07001092<code>drawable-port-notouch-12key</code> вычеркивается.</p>
1093
1094<p>Для получения более подробной информации об использовании ресурсов в приложении перейдите к разделу <a href="accessing-resources.html">Доступ к ресурсам</a>.</p>