| 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>Если предыдущий экран одновременно является иерархическим родителем текущего, |
| кнопка "Назад" имеет то же действие, что и кнопка "Вверх"—, и это случается довольно |
| часто. Однако, в отличие от кнопки "Вверх", гарантирующей, что пользователь остается в приложении, кнопка "Назад" |
| может перевести его на главный экран или даже в другое приложение.</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>Однако существует важное исключение из этого правила во время просмотра подробных представлений элементов, не связанных |
| вместе ссылающимся списком, например—, приложений |
| одного разработчика или альбомов одного исполнителя в 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>Кнопка "Назад" действует не так, как в случае со стандартными (прямыми) уведомлениями. Нажав ее на промежуточном экране косвенного уведомления, |
| пользователь вернется в точку, где было сгенерировано уведомление, —поскольку |
| в стеке переходов назад не появились никакие дополнительные экраны. Если пользователь перейдет в приложение с |
| промежуточного экрана, поведение кнопок "Вверх" и "Назад" будет таким же, как и при стандартных уведомлениях: |
| навигация внутри приложения, а не возврат к промежуточному экрану.</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—, и никакая новая задача не создается. Если в фоновом режиме работает собственная задача 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> |