page.title=Навигация с помощью кнопок "Назад" и "Вверх"
page.tags="navigation","activity","task","up navigation","back navigation"
page.image=/design/media/navigation_between_siblings_gmail.png
@jd:body
Обеспечение эффективной навигацииДокументация для разработчиков
Внутренне непротиворечивая навигация является важнейшей составляющей пользовательского интерфейса. Мало что так раздражает пользователей, как несогласованное или непредсказуемое поведение элементов навигации. В Android 3.0 глобальное поведение навигации претерпело значительные изменения. Тщательное следование инструкциям по применению кнопок "Назад" и "Вверх" сделает навигацию в вашем приложении предсказуемой и надежной с точки зрения пользователей.
В Android 2.3 и в более ранних версиях для навигации внутри приложения использовалась системная кнопка Назад. С появлением панели действий в Android 3.0 стал доступен второй механизм навигации, — кнопка Вверх, содержащая значок приложения и левую угловую скобку.
Кнопка "Вверх" используется для навигации внутри приложения по иерархической структуре его экранов. Например, если на экране A отображается некоторый список, и при выборе какого-либо элемента открывается экран B (с подробной информацией об этом элементе), то на экране B должна присутствовать кнопка "Вверх" для возврата к экрану A.
Если экран является самым верхним в приложении (то есть главным), он не должен содержать кнопку "Вверх".
Системная кнопка "Назад" используется для навигации в обратном хронологическом порядке среди экранов, недавно открытых пользователем. Такая навигация основана на порядке появления экранов, а не на иерархии приложения.
Если предыдущий экран одновременно является иерархическим родителем текущего, кнопка "Назад" имеет то же действие, что и кнопка "Вверх"—, и это случается довольно часто. Однако, в отличие от кнопки "Вверх", гарантирующей, что пользователь остается в приложении, кнопка "Назад" может перевести его на главный экран или даже в другое приложение.
Кроме того, кнопка "Назад" проявляет поведение, не связанное напрямую с навигацией между экранами. Она
Некоторые экраны не имеют строгой позиции в иерархии приложения, и на них можно перейти из нескольких точек. Например, на экран настроек можно попасть из любого другого экрана приложения. В таком случае кнопка "Вверх" должна осуществлять возврат на вызвавший экран, т. е. вести себя идентично кнопке "Назад".
Изменение параметров представления содержимого на экране не сказывается на поведении кнопок "Вверх" и "Назад", — экран остается на прежнем месте в иерархии приложения, а история навигации не меняется.
Примерами изменения представления являются
Когда приложение поддерживает навигацию от списка к подробному представлению одного из его элементов, нередко имеет смысл поддержать навигацию от этого элемента к другому, идущему в списке до или после него. Например, в Gmail можно провести пальцем влево или вправо по переписке, чтобы просмотреть предыдущие или последующие входящие сообщения. Как и в случае изменения представления на экране, такая навигация не меняет поведение кнопок "Вверх" и "Назад".
Однако существует важное исключение из этого правила во время просмотра подробных представлений элементов, не связанных вместе ссылающимся списком, например—, приложений одного разработчика или альбомов одного исполнителя в Play Store. В этих случаях переход по каждой ссылке создает историю навигации, что заставляет кнопку "Назад" перебирать все ранее просмотренные экраны. Кнопка "Вверх" должна по-прежнему игнорировать эти связанные по смыслу экраны и осуществлять переход на последний просмотренный контейнерный экран.
Разработчик может сделать поведение кнопки "Вверх" еще более интеллектуальным, исходя из своих знаний о структуре подробного представления. Вернемся к примеру с просмотром Play Store. Представьте, что пользователь перешел от информации о книге к информации о ее экранизации. Тогда кнопка "Вверх" могла бы переводить пользователя в контейнер (Фильмы), в котором он еще не был.
У разработчика также есть возможность использовать уведомления или виджеты главного экрана, чтобы помочь пользователю переходить к экранам, расположенным глубоко в иерархической структуре приложения. Например, виджет Inbox приложения Gmail и уведомление о новом сообщении могут перевести пользователя непосредственно к переписке, в обход экрана с входящими сообщениями.
В обоих этих случаях реализуйте следующее поведение кнопки "Вверх":
Что касается кнопки "Назад", необходимо обеспечить более предсказуемую навигацию, вставив в в стек переходов назад полный путь навигации вверх к самому верхнему экрану приложения. Это позволит пользователям, забывшим, как они вошли в приложение, перейти к его главному экрану перед выходом из приложения.
Например, виджет главного экрана Gmail имеет кнопку, переводящую пользователя прямо на экран создания сообщений. Кнопки "Вверх" или "Назад" переведут пользователя с этого экрана на экран входящих писем, а оттуда кнопка "Назад" переведет его на главную страницу.
Когда приложению нужно вывести информацию сразу о нескольких событиях, оно может выдать одно уведомление, направляющее пользователя на промежуточный экран. Этот экран содержит сводку событий и предоставляет пользователю возможность перейти вглубь приложения. Такие уведомления называются косвенными.
Кнопка "Назад" действует не так, как в случае со стандартными (прямыми) уведомлениями. Нажав ее на промежуточном экране косвенного уведомления, пользователь вернется в точку, где было сгенерировано уведомление, —поскольку в стеке переходов назад не появились никакие дополнительные экраны. Если пользователь перейдет в приложение с промежуточного экрана, поведение кнопок "Вверх" и "Назад" будет таким же, как и при стандартных уведомлениях: навигация внутри приложения, а не возврат к промежуточному экрану.
Например, предположим, что пользователь получил косвенное уведомление от приложения Calendar при открытом приложении Gmail. Если он коснется этого уведомления, откроется промежуточный экран с напоминаниями о нескольких событиях. Касание кнопки "Назад" на промежуточном экране возвратит пользователя в Gmail. Если пользователь коснется конкретного события, он перейдет с промежуточного экрана в приложение Calendar к подробной информации о событии. Оттуда кнопки "Вверх" и "Назад" переведут его на верхний уровень приложения Calendar.
Всплывающие уведомления появляются непосредственно перед пользователем, в обход панели уведомлений. Они используются редко и должны быть зарезервированы для ситуаций, в которых требуется немедленная реакция пользователя, и прерывание его действий оправдано. Например, приложение Talk с помощью таких уведомлений извещает пользователя о поступившем от друга приглашении присоединиться к видеочату, поскольку срок действия этого приглашения истекает через несколько секунд.
В отношении навигации всплывающие уведомления ведут себя во многом аналогично промежуточному экрану косвенного уведомления. Кнопка "Назад" удаляет всплывающее уведомление. Если пользователь переходит от всплывающего уведомления к уведомляющему приложению, кнопки "Вверх" и "Назад" действуют, как при стандартных уведомлениях, выполняя навигацию внутри приложения.
Одним из фундаментальных достоинств системы Android является способность приложений активировать друг друга, что дает пользователю возможность переходить непосредственно из одного приложения в другое. Например, приложение, которому нужно сделать снимок, может активировать приложение Camera, которое передаст фотографию вызвавшему приложению. Это огромное преимущество, как для разработчика, имеющего возможность без проблем воспользоваться кодом других приложений, так и для пользователя, получающего согласованный интерфейс для часто выполняемых действий.
Чтобы разобраться в навигации между приложениями, необходимо разобраться в поведении платформы Android, которое обсуждается ниже.
Действие в Android — это компонент приложения, определяющий экран с информацией и все действия, которые при этом может выполнить пользователь. Приложение представляет собой набор действий, состоящий как из действий, созданных разработчиком, так и из тех, которые выполняются с помощью других приложений.
Задача — последовательность действий, выполняемых пользователем для достижения цели. Отдельная задача может использовать действия, заимствованные у одного или у нескольких различных приложений.
Намерение — механизм, позволяющий приложению сигнализировать, что ему требуется помощь другого приложения в выполнении некоторого действия. Действия, выполняемые приложением, могут указывать, на какие намерения они готовы отвечать. Для осуществления достаточно распространенных намерений, например, "Поделиться", у пользователя может быть установлено несколько приложений, способных выполнить соответствующий запрос.
Чтобы понять, как действия, задачи и намерения взаимодействуют друг с другом, разберемся, как одно приложение позволяет пользователям поделиться содержимым с помощью другого приложения. Например, запуск приложения Play Store из главного экрана создает новую задачу, Task A (см. рисунок ниже). Когда пользователь выполнит навигацию по Play Store и коснется интересующей его книги, чтобы просмотреть информацию о ней, он останется в том же приложении, расширив его возможности с помощью добавленных действий. Запуск действия "Поделиться" выводит перед пользователем диалоговое окно со списком действий (из разных приложений), зарегистрированных для выполнения намерения "Поделиться".
Если пользователь предпочтет поделиться информацией через Gmail, действие "Написать" приложения Gmail добавляется как продолжение задачи Task A—, и никакая новая задача не создается. Если в фоновом режиме работает собственная задача Gmail, на нее это никак не повлияет.
Если во время действия "Составление сообщения" пользователь отправит сообщение или коснется кнопки "Назад", он вернется к действию "Просмотр информации о книге". Продолжая нажимать на "Назад", пользователь будет совершать переходы назад в Play Store, пока, наконец, не вернется на главный экран.
Однако, коснувшись кнопки "Вверх" во время действия "Составление сообщения", пользователь выскажет пожелание остаться в приложении Gmail. Откроется экран действия "Переписка" приложения Gmail, и для него будет создано новая задача Task B. Новые задачи всегда имеют корень на главном экране, поэтому касание кнопки "Назад" на экране переписки возвращает пользователя именно туда.
Задача Task A остается в фоновом режиме, и пользователь может вернуться к ней впоследствии (например, с помощью экрана с последними приложениями). Если в фоновом режиме уже работает собственная задача Gmail, она будет замещена задачей Task B. Произойдет отказ от предыдущего контекста ради новой цели пользователя.
Если для обработки намерений ваше приложение зарегистрирует действие, расположенное в глубине своей иерархии, следуйте инструкциям по реализации навигации с помощью кнопки "Вверх", изложенным в разделе Навигация внутрь приложения с помощью виджетов и уведомлений главного экрана.