blob: a65a8f6f23bd71fad3be4aef19f82a9876a0a5bc [file] [log] [blame]
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>