summaryrefslogtreecommitdiffstats
path: root/docs/html-intl/intl/ru/design/patterns/navigation.jd
blob: a65a8f6f23bd71fad3be4aef19f82a9876a0a5bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
page.title=Навигация с помощью кнопок "Назад" и "Вверх"
page.tags="navigation","activity","task","up navigation","back navigation"
page.image=/design/media/navigation_between_siblings_gmail.png
@jd:body

<a class="notice-developers" href="{@docRoot}training/implementing-navigation/index.html">
  <div>
    <h3>Документация для разработчиков</h3>
    <p>Обеспечение эффективной навигации</p>
  </div>
</a>

<p itemprop="description">Внутренне непротиворечивая навигация является важнейшей составляющей пользовательского интерфейса. Мало что так раздражает
пользователей, как несогласованное или непредсказуемое поведение элементов навигации. В Android 3.0
глобальное поведение навигации претерпело значительные изменения. Тщательное следование
инструкциям по применению кнопок "Назад" и "Вверх" сделает навигацию в вашем приложении предсказуемой и надежной с точки зрения пользователей.</p>
<p>В Android 2.3 и в более ранних версиях для навигации внутри приложения использовалась системная кнопка <em>Назад</em>.
 С появлением панели действий в Android 3.0 стал доступен второй механизм 
навигации, — кнопка <em>Вверх</em>, содержащая значок приложения и левую угловую скобку.</p>

<img src="{@docRoot}design/media/navigation_with_back_and_up.png">

<h2 id="up-vs-back">Кнопки "Вверх" и "Назад"</h2>

<p>Кнопка "Вверх" используется для навигации внутри приложения по иерархической структуре его
экранов. Например, если на экране A отображается некоторый список, и при выборе какого-либо элемента открывается
экран B (с подробной информацией об этом элементе), то на экране B должна присутствовать кнопка "Вверх"
 для возврата к экрану A.</p>
<p>Если экран является самым верхним в приложении (то есть главным), он не должен содержать кнопку
"Вверх".</p>

<p>Системная кнопка "Назад" используется для навигации в обратном хронологическом порядке среди
экранов, недавно открытых пользователем. Такая навигация основана на порядке появления
экранов, а не на иерархии приложения.</p>

<p>Если предыдущий экран одновременно является иерархическим родителем текущего, 
кнопка "Назад" имеет то же действие, что и кнопка "Вверх"&mdash;, и это случается довольно
часто. Однако, в отличие от кнопки "Вверх", гарантирующей, что пользователь остается в приложении, кнопка "Назад"
может перевести его на главный экран или даже в другое приложение.</p>

<img src="{@docRoot}design/media/navigation_up_vs_back_gmail.png">

<p>Кроме того, кнопка "Назад" проявляет поведение, не связанное напрямую с навигацией между экранами. Она
</p>
<ul>
<li>закрывает перемещаемые окна (диалоговые, всплывающие);</li>
<li>закрывает контекстные панели действий и снимает выделение с выделенных элементов;</li>
<li>скрывает экранную клавиатуру (IME).</li>
</ul>
<h2 id="within-app">Навигация внутри приложения</h2>

<h4>Переход на экраны с несколькими точками входа</h4>
<p>Некоторые экраны не имеют строгой позиции в иерархии приложения, и на них можно перейти
из нескольких точек. Например, на экран настроек можно попасть из любого другого экрана
приложения. В таком случае кнопка "Вверх" должна осуществлять возврат на вызвавший экран, т. е. вести себя
идентично кнопке "Назад".</p>
<h4>Изменение представления содержимого на экране</h4>
<p>Изменение параметров представления содержимого на экране не сказывается на поведении кнопок "Вверх" и "Назад", — экран остается
на прежнем месте в иерархии приложения, а история навигации не меняется.</p>
<p>Примерами изменения представления являются</p>
<ul>
<li>переключение представлений с помощью вкладок или жестов прокрутки вправо/влево;</li>
<li>переключение представлений с помощью раскрывающихся (или свернутых) вкладок;</li>
<li>фильтрация списка;</li>
<li>сортировка списка;</li>
<li>изменение характеристик отображения (например, масштаба).</li>
</ul>
<h4>Навигация между экранами одного уровня</h4>
<p>Когда приложение поддерживает навигацию от списка к подробному представлению одного из его элементов, нередко
имеет смысл поддержать навигацию от этого элемента к другому, идущему в списке до или
после него. Например, в Gmail можно провести пальцем влево или вправо по переписке,
чтобы просмотреть предыдущие или последующие входящие сообщения. Как и в случае изменения представления на экране, такая
навигация не меняет поведение кнопок "Вверх" и "Назад".</p>

<img src="{@docRoot}design/media/navigation_between_siblings_gmail.png">

<p>Однако существует важное исключение из этого правила во время просмотра подробных представлений элементов, не связанных
вместе ссылающимся списком, например&mdash;, приложений
одного разработчика или альбомов одного исполнителя в Play Store. В этих случаях переход по каждой ссылке создает
историю навигации, что заставляет кнопку "Назад" перебирать все ранее просмотренные экраны. Кнопка "Вверх" должна по-прежнему
игнорировать эти связанные по смыслу экраны и осуществлять переход на последний просмотренный контейнерный экран.</p>

<img src="{@docRoot}design/media/navigation_between_siblings_market1.png">

<p>Разработчик может сделать поведение кнопки "Вверх" еще более интеллектуальным, исходя из своих знаний о структуре подробного
представления. Вернемся к примеру с просмотром Play Store. Представьте, что пользователь перешел от информации о
книге к информации о ее экранизации. Тогда кнопка "Вверх" могла бы переводить пользователя в контейнер
(Фильмы), в котором он еще не был.</p>

<img src="{@docRoot}design/media/navigation_between_siblings_market2.png">

<h2 id="into-your-app">Навигация внутрь приложения с помощью уведомлений и виджетов главного экрана</h2>

<p>У разработчика также есть возможность использовать уведомления или виджеты главного экрана, чтобы помочь пользователю переходить к экранам,
расположенным глубоко в иерархической структуре приложения. Например, виджет Inbox приложения Gmail и уведомление о новом сообщении могут
 перевести пользователя непосредственно к переписке, в обход экрана с входящими сообщениями.</p>

<p>В обоих этих случаях реализуйте следующее поведение кнопки "Вверх":</p>

<ul>
<li><em>Если целевой экран, как правило, достигается из одного конкретного экрана 
приложения</em>, кнопка "Вверх" должна осуществлять переход на этот экран.</li>
<li><em>В противном случае</em> кнопка "Вверх" должна осуществлять переход на самый верхний (главный) экран приложения.</li>
</ul>

<p>Что касается кнопки "Назад", необходимо обеспечить более предсказуемую навигацию, вставив в 
в стек переходов назад полный путь навигации вверх к самому верхнему экрану приложения. Это позволит пользователям,
забывшим, как они вошли в приложение, перейти к его главному экрану перед выходом из
приложения.</p>

<p>Например, виджет главного экрана Gmail имеет кнопку, переводящую пользователя прямо на экран
создания сообщений. Кнопки "Вверх" или "Назад" переведут пользователя с этого экрана на экран входящих писем, а оттуда
кнопка "Назад" переведет его на главную страницу.</p>

<img src="{@docRoot}design/media/navigation_from_outside_back.png">

<h4>Косвенные уведомления</h4>

<p>Когда приложению нужно вывести информацию сразу о нескольких событиях, оно может выдать
одно уведомление, направляющее пользователя на промежуточный экран. Этот экран содержит сводку
событий и предоставляет пользователю возможность перейти вглубь приложения. Такие уведомления
называются <em>косвенными</em>.</p>

<p>Кнопка "Назад" действует не так, как в случае со стандартными (прямыми) уведомлениями. Нажав ее на промежуточном экране косвенного уведомления,
пользователь вернется в точку, где было сгенерировано уведомление, &mdash;поскольку
в стеке переходов назад не появились никакие дополнительные экраны. Если пользователь перейдет в приложение с
промежуточного экрана, поведение кнопок "Вверх" и "Назад" будет таким же, как и при стандартных уведомлениях:
навигация внутри приложения, а не возврат к промежуточному экрану.</p>

<p>Например, предположим, что пользователь получил косвенное уведомление от приложения Calendar при открытом приложении Gmail. Если он коснется
этого уведомления, откроется промежуточный экран с напоминаниями о нескольких
событиях. Касание кнопки "Назад" на промежуточном экране возвратит пользователя в Gmail. Если пользователь коснется конкретного
события, он перейдет с промежуточного экрана в приложение Calendar к подробной информации о
событии. Оттуда кнопки "Вверх" и "Назад" переведут его на верхний уровень приложения Calendar.</p>

<img src="{@docRoot}design/media/navigation_indirect_notification.png">

<h4>Всплывающие уведомления</h4>

<p><em>Всплывающие уведомления</em> появляются непосредственно перед пользователем,
в обход панели уведомлений. Они используются редко и <strong>должны быть зарезервированы для ситуаций, в которых требуется немедленная
реакция пользователя, и прерывание его действий оправдано</strong>. Например, 
приложение Talk с помощью таких уведомлений извещает пользователя о поступившем от друга приглашении присоединиться к видеочату, поскольку срок действия этого
приглашения истекает через несколько секунд.</p>

<p>В отношении навигации всплывающие уведомления ведут себя во многом аналогично промежуточному экрану
косвенного уведомления. Кнопка "Назад" удаляет всплывающее уведомление. Если пользователь переходит
от всплывающего уведомления к уведомляющему приложению, кнопки "Вверх" и "Назад" действуют, как при стандартных уведомлениях,
выполняя навигацию внутри приложения.</p>

<img src="{@docRoot}design/media/navigation_popup_notification.png">

<h2 id="between-apps">Навигация между приложениями</h2>

<p>Одним из фундаментальных достоинств системы Android является способность приложений активировать друг
друга, что дает пользователю возможность переходить непосредственно из одного приложения в другое. Например, 
приложение, которому нужно сделать снимок, может активировать приложение Camera, которое передаст фотографию
вызвавшему приложению. Это огромное преимущество, как для разработчика, имеющего возможность без проблем воспользоваться
кодом других приложений, так и для пользователя, получающего согласованный интерфейс для часто выполняемых
действий.</p>

<p>Чтобы разобраться в навигации между приложениями, необходимо разобраться в поведении платформы Android,
которое обсуждается ниже.</p>

<h4>Действия, задачи и намерения</h4>

<p><strong>Действие</strong> в Android — это компонент приложения, определяющий экран с
информацией и все действия, которые при этом может выполнить пользователь. Приложение представляет собой набор
действий, состоящий как из действий, созданных разработчиком, так и из тех, которые выполняются с помощью других приложений.</p>

<p><strong>Задача</strong> — последовательность действий, выполняемых пользователем для достижения цели. Отдельная
задача может использовать действия, заимствованные у одного или у нескольких
различных приложений.</p>

<p><strong>Намерение</strong> — механизм, позволяющий приложению сигнализировать, что ему требуется помощь
другого приложения в выполнении некоторого действия. Действия, выполняемые приложением, могут указывать, на какие намерения
они готовы отвечать. Для осуществления достаточно распространенных намерений, например, "Поделиться", у пользователя может быть установлено несколько приложений,
 способных выполнить соответствующий запрос.</p>

<h4>Пример: навигация между приложениями для поддержки совместного использования ресурсов</h4>

<p>Чтобы понять, как действия, задачи и намерения взаимодействуют друг с другом, разберемся, как одно приложение позволяет пользователям
поделиться содержимым с помощью другого приложения. Например, запуск приложения Play Store из главного экрана создает
новую задачу, Task A (см. рисунок ниже). Когда пользователь выполнит навигацию по Play Store и коснется интересующей его книги,
чтобы просмотреть информацию о ней, он останется в том же приложении, расширив его возможности с помощью добавленных действий. Запуск 
действия "Поделиться" выводит перед пользователем диалоговое окно со списком действий (из разных приложений),
зарегистрированных для выполнения намерения "Поделиться".</p>

<img src="{@docRoot}design/media/navigation_between_apps_inward.png">

<p>Если пользователь предпочтет поделиться информацией через Gmail, действие "Написать" приложения Gmail добавляется как продолжение задачи
Task A&mdash;, и никакая новая задача не создается. Если в фоновом режиме работает собственная задача Gmail, на нее это никак
не повлияет.</p>

<p>Если во время действия "Составление сообщения" пользователь отправит сообщение или коснется кнопки "Назад", он вернется к
 действию "Просмотр информации о книге". Продолжая нажимать на "Назад", пользователь будет совершать переходы назад в Play
Store, пока, наконец, не вернется на главный экран.</p>

<img src="{@docRoot}design/media/navigation_between_apps_back.png">

<p>Однако, коснувшись кнопки "Вверх" во время действия "Составление сообщения", пользователь выскажет пожелание остаться в приложении 
Gmail. Откроется экран действия "Переписка" приложения Gmail, и для него будет создано новая задача Task B. Новые задачи
всегда имеют корень на главном экране, поэтому касание кнопки "Назад" на экране переписки возвращает пользователя именно туда.</p>

<img src="{@docRoot}design/media/navigation_between_apps_up.png">

<p>Задача Task A остается в фоновом режиме, и пользователь может вернуться к ней впоследствии (например, с помощью 
экрана с последними приложениями). Если в фоновом режиме уже работает собственная задача Gmail, она будет замещена
задачей Task B. Произойдет отказ от предыдущего контекста ради новой цели пользователя.</p>

<p>Если для обработки намерений ваше приложение зарегистрирует действие, расположенное в глубине своей иерархии,
следуйте инструкциям по реализации навигации с помощью кнопки "Вверх", изложенным в разделе <a href="#into-your-app">Навигация внутрь приложения с помощью виджетов и 
уведомлений главного экрана</a>.</p>