- Как реализовать кнопку Android ActionBar назад?
- 8 ответов
- Android, API 5+:
- ActionBarSherlock и App-Compat, API 7+:
- Android, API 11+:
- Android, API 16+:
- Отобразить стрелку назад на панели инструментов
- Показать Назад Стрелка на панели инструментов Android
- Клавиатура и аппаратные кнопки
- Аппаратные и клавиатурные клавиши
- Кнопка Back: Вы уверены, что хотите выйти из программы?
- Двойное нажатие на кнопку Back
- Кнопка Home
- Обработка кнопки Menu
- Другие кнопки
- Прячем клавиатуру
- Изменить вид клавиатуры для EditText
- Переопределяем кнопку Enter
- Интерфейс OnKeyListener
- Сдвигаем активность
- Узнать выбранный язык на клавиатуре
Как реализовать кнопку Android ActionBar назад?
У меня есть действие с listview. Когда пользователь нажимает на элемент, открывается элемент «viewer»:
это работает нормально, но на панели действий стрелка назад рядом со значком приложения не активируется. Я что-то упускаю?
8 ответов
Selvin уже опубликовал правильный ответ, вот только решение в довольно коде; -)
функции NavUtils.navigateUpFromSameTask(this) требуется определить родительскую активность в AndroidManifest.xml-файл
убедитесь, что кнопка ActionBar Home включена в действии:
Android, API 5+:
ActionBarSherlock и App-Compat, API 7+:
Android, API 11+:
пример MainActivity что расширяет ActionBarActivity :
таким образом, все действия, которые вы хотите, могут иметь backpress.
Android, API 16+:
пример MainActivity что расширяет ActionBarActivity :
чтобы включить кнопку ActionBar назад, вам, очевидно, нужна панель действий в вашей деятельности. Это набор темы. Вы можете установить тему для своей деятельности в AndroidManfiest.xml . Если вы используете e.g @android:style/Theme.NoTitleBar тема, у вас нет ActionBar. В этом случае вызов getActionBar() возвращают значение null. Поэтому сначала убедитесь, что у вас есть ActionBar.
следующий шаг-установить android:parentActivityName к деятельности, которую вы хотите перейти, если вы нажмете кнопку Назад. Это должно быть сделано в the AndroidManfiest.xml тоже.
вы можете включить кнопку «Назад» в onCreate метод «детской» деятельности.
теперь вы должны реализовать логику для кнопки Назад. Вы просто переопределяете onOptionsItemSelected метод в вашей» детской «деятельности и проверьте идентификатор кнопки «Назад», которая является android.R.id.home .
теперь вы можете запустить метод NavUtils.navigateUpFromSameTask(this); но если вы не указали android:parentActivityName В вы AndroidManfiest.xml это приведет к краху приложения.
иногда это то, что вы хотите, потому что это напоминает вам, что вы забыли «что-то», но если вы хотите предотвратить это, вы можете проверить, есть ли у вашей деятельности родитель, используя getParentActivityIntent() метод. Если это возвращает null,вы не указали родителя.
в этом случае вы можете уволить onBackPressed() метод, который делает в основном то же, как если бы пользователь нажмите кнопку назад на устройстве. Хорошая реализация, которая никогда не crashs вы приложение будет
обратите внимание, что анимация, которую видит пользователь, отличается от NavUtils.navigateUpFromSameTask(this); и onBackPressed() .
это зависит от вас, какую дорогу вы берете, но я нашел решение полезным, особенно если вы используете базовый класс для всех своих действий.
Источник
Отобразить стрелку назад на панели инструментов
Я мигрируют из ActionBar к Toolbar в моем приложении. Но я не знаю, как отобразить и установить событие нажатия на Back Arrow, Toolbar как я это делал Actionbar .
С ActionBar , я звоню mActionbar.setDisplayHomeAsUpEnabled(true) . Но подобного метода не существует.
Кто-нибудь когда-нибудь сталкивался с такой ситуацией и как-то нашел способ ее решить?
Если вы используете, ActionBarActivity то вы можете сказать Android использовать Toolbar как ActionBar :
будет работать. Вы также можете использовать это во фрагментах, которые прикреплены к ActionBarActivities вам, вы можете использовать это так:
Если вы не используете ActionBarActivities или хотите, чтобы стрелка назад на Toolbar значке не была указана как ваша, SupportActionBar вы можете использовать следующее:
Если вы используете android.support.v7.widget.Toolbar , то вы должны добавить следующий код к вашему AppCompatActivity :
Я вижу много ответов, но вот мой, который не упоминался ранее. Работает с API 8+.
Есть много способов добиться этого, вот мой любимый:
Вы можете использовать метод setNavigationIcon панели инструментов. Android Doc
Если вы не хотите создавать кастом Toolbar , вы можете сделать это
В тебе AndroidManifest.xml
Вы также можете поместить это android:theme=»@style/Theme.AppCompat.Light» в теге, для применять ко всем видам деятельности
И для API 21+ android:navigationIcon
Если вы получите исключение нулевого указателя, это может зависеть от темы. Попробуйте использовать другую тему в манифесте или используйте это альтернативно:
Затем в манифесте, где я устанавливаю родительское действие для текущего действия:
Я надеюсь, что это поможет вам!
Если вы были с помощью AppCompatActivity и пошли по пути он не используется, потому что вы хотите , чтобы не получить автоматическое , ActionBar что она обеспечивает, потому что вы хотите выделить Toolbar , из — за ваших потребностей Material Design и CoordinatorLayout или AppBarLayout , то, считаю , что это:
Вы все еще можете использовать AppCompatActivity , вам не нужно прекращать использовать его только для того, чтобы вы могли использовать в вашем XML. Просто отключите стиль панели действий следующим образом:
Во-первых, выведите стиль из одной из тем NoActionBar, которая вам нравится в вашей styles.xml , которую я использовал Theme.AppCompat.Light.NoActionBar следующим образом:
В манифесте своего приложения выберите только что определенную тему дочернего стиля, например:
В вашем Activity Xml, если панель инструментов определена так:
Затем, и это важная часть, вы устанавливаете для панели действий поддержки значение AppCompatActivity, которое вы расширяете, чтобы панель инструментов в xml стала панелью действий. Мне кажется, что это лучший способ, потому что вы можете просто делать множество вещей, которые позволяет ActionBar, например, меню, автоматический заголовок активности, обработку выбора элементов и т. Д., Не прибегая к добавлению пользовательских обработчиков кликов и т. Д.
В переопределении onCreate вашей активности выполните следующие действия:
Источник
Показать Назад Стрелка на панели инструментов Android
Я переношу из ActionBar в Toolbar в своем приложении. Но я не знаю, как отображать и устанавливать событие click на Toolbar Back Arrow на Toolbar как Actionbar на Toolbar Actionbar .
С помощью ActionBar я вызываю mActionbar.setDisplayHomeAsUpEnabled(true) . Но подобного метода нет.
Кто-нибудь когда-либо сталкивался с такой ситуацией и каким-то образом нашел способ ее решить?
Если вы используете ActionBarActivity вы можете сказать Android, чтобы использовать Toolbar в качестве ActionBar следующим образом:
будет работать. Вы также можете использовать это в Фрагментах, которые прикреплены к ActionBarActivities вы можете использовать его следующим образом:
Если вы не используете ActionBarActivities или хотите получить стрелку назад на Toolbar которая не установлена в качестве SupportActionBar вы можете использовать следующее:
Если вы используете android.support.v7.widget.Toolbar , то вы должны добавить следующий код в свой AppCompatActivity :
Я вижу много ответов, но вот моя, о которой не упоминалось ранее. Он работает от API 8+.
Вы можете использовать инструмент setNavigationIcon инструментальной панели. Android Doc
Есть много способов добиться этого, вот мой любимый:
Если вы использовали AppCompatActivity и пошли по пути не использовать его, потому что вы не хотели получать автоматический ActionBar который он предоставляет, потому что вы хотите выделить Toolbar из-за ваших потребностей в Material Design и CoordinatorLayout или AppBarLayout , тогда , учти это:
Вы все равно можете использовать AppCompatActivity , вам не нужно прекращать использовать его, чтобы вы могли использовать в своем xml. Просто отключите стиль панели действий следующим образом:
Во-первых, выведите стиль из одной из тем NoActionBar, которые вам нравятся в ваших styles.xml , я использовал Theme.AppCompat.Light.NoActionBar следующим образом:
В манифесте вашего приложения выберите тему детского стиля, которую вы только что определили, например:
В вашей деятельности Xml, если панель инструментов определена следующим образом:
Затем, и это важная часть, вы устанавливаете панель действий поддержки в AppCompatActivity, которую вы расширяете, так что панель инструментов в вашем xml становится панель действий. Я считаю, что это лучший способ, потому что вы можете просто делать много вещей, которые позволяет ActionBar, например меню, название автоматической активности, управление выборами элементов и т. Д., Не прибегая к добавлению пользовательских обработчиков кликов и т. Д.
В переопределении onCreate вашей деятельности выполните следующие действия:
А для API 21+ android:navigationIcon
Я использовал этот метод в документации Google Developer :
Если вы получаете исключение из null-указателя, это может зависеть от темы. Попробуйте использовать другую тему в манифесте или используйте это в качестве альтернативы:
Затем в манифесте, где я устанавливаю родительскую активность для текущей активности:
Я надеюсь, что это поможет вам!
Это отлично работало
Если вы не хотите создавать пользовательскую Toolbar , вы можете сделать это следующим образом:
Источник
Клавиатура и аппаратные кнопки
Аппаратные и клавиатурные клавиши
Обработка аппаратных клавиш и клавиатуры имеет следующие методы
- onKeyDown() — вызывается при нажатии любой аппаратной клавиши;
- onKeyUp() — вызывается при отпускании любой аппаратной клавиши;
Кроме клавиш, есть ещё другие методы обработки пользовательского ввода (здесь не рассматриваются):
- onTrackballEvent() — срабатывает при движениях трекбола;
- onTouchEvent() — обработчик событий сенсорного экрана, срабатывает при касании, убирания пальца и при перетаскивании.
Чтобы ваши компоненты и активности реагировали на нажатия клавиш, переопределите обработчики событий onKeyUp() и onKeyDown():
Параметр keyCode содержит код клавиши, которая была нажата; сравнивайте его со статическими кодами клавиш, хранящимися в классе KeyEvent, чтобы выполнять соответствующую обработку.
Параметр KeyEvent также включает в себя несколько методов: isAltPressed(), isShiftPressed() и isSymPressed(), определяющих, были ли нажаты функциональные клавиши, такие как Alt, Shift или Sym. Статический метод isModifierKey() принимает keyCode и определяет, является ли нажатая клавиша модификатором.
Кнопка Back: Вы уверены, что хотите выйти из программы?
Кнопка Back (Назад) закрывает приложение, точнее текущую активность, но если приложение состоит из одной активности, то это равносильно закрытию всего приложения. В большинстве случаев вам нет никакого дела до неуклюжего пользователя, который по ошибке нажал на кнопку «Back» вместо кнопки Подарить разработчику миллион. Но, если ваша программа, будучи запущенной на телефоне пользователя, потихоньку списывает деньги клиента в счёт Фонда голодных котов, то нужно дать ему шанс задуматься и вывести диалоговое окно с вопросом: «А действительно ли вы хотите выйти из программы?»
Чтобы реализовать такую задачу, нужно переопределить поведение кнопки «Back» через метод активности onBackPressed() следующим образом:
Данный метод появился в Android 2.0. Для более ранних версий использовался стандартный код обработки onKeyDown():
Двойное нажатие на кнопку Back
Другой вариант — выход из приложения при двойном нажатии на кнопку «Back». Удобно в тех случаях, когда считаете, что пользователь может случайно нажать на кнопку, например, во время активной игры. Приложение закроется, если пользователь дважды нажмёт на кнопку в течение двух секунд.
Кнопка Home
Можно отследить нажатие кнопки Home через метод активности onUserLeaveHint():
Обработка кнопки Menu
У телефона, кроме кнопки «Back», есть ещё кнопка «Menu» для вызова команд меню (на старых устройствах). Если необходимо обрабатывать нажатия этой кнопки (например, управление в игре), то используйте следующий код (обычное и долгое нажатие):
Должен заметить, что длинное нажатие трудно уловить, так как обычное нажатие постоянно подавляет это событие.
Другие кнопки
Ну на самом деле можно отслеживать не только нажатие кнопки Меню, но и кнопку Поиска и кнопки увеличения громкости.
Обратите внимание, что для кнопки громкости возвращаем false, т.е. мы не переопределяем поведение кнопки, а оставляем её на усмотрение системы.
Пример работы с кнопками громкости можно посмотреть в статье Рингтоны. Управление громкостью
По такому же принципу работает метод onKeyUp(). Метод onKeyLongPress() можно использовать, если в методе onKeyDown() был задействован метод event.startTracking(), отслеживающий поведение кнопки. В нашем примере мы отслеживали кнопку Volume_Up.
Прячем клавиатуру
Бывает так, что при запуске активности сразу выскакивает клавиатура. Если такое поведение не нравится, то пропишите в манифесте нужное значение у атрибута android:windowSoftInputMode (см. ниже).
В некоторых случаях хочется убрать клавиатуру с экрана, не нажимая кнопку «Back», а программно. В одном моём приложении, где было много текстовых полей, я воспользовался следующим кодом при щелчке кнопки:
Код так выглядит, если писать его в Activity. Если расположить его в другом классе, экземпляр Activity нужно передать туда как параметр и вызывать методы как activity.getApplicationContext(), где activity — экземпляр Activity.
Можно избавить компонент от фокуса:
Чтобы принудительно показать клавиатуру, используйте следующий код:
Кстати, повторный вызов метода закроет клавиатуру. Указанный способ не требует наличия элементов View.
Если продолжить тему показа клавиатуры, то может возникнуть следующая ситуация. Допустим у вас есть DialogFragment с EditText. При выводе диалогового окна вам нужно установить фокус на EditText и показать клавиатуру:
Либо используйте тег для нужного EditText.
Изменить вид клавиатуры для EditText
Когда элемент EditText получает фокус, то появляется клавиатура. Можно установить нужный вид клавиатуры через атрибут InputType или программно через метод setInputType():
TYPE_CLASS_DATETIME — дата и время
TYPE_CLASS_NUMBER — цифры
TYPE_CLASS_TEXT — буквы
Переопределяем кнопку Enter
Кроме атрибута InputType можно также использовать атрибут android:imeOptions в компоненте EditText, который позволяет заменить кнопку Enter на клавиатуре на другие кнопки, например, Next, Go, Search и др. Возможны следующие значения:
- actionUnspecified: Используется по умолчанию. Система сама выбирает нужный вид кнопки (IME_NULL)
- actionGo: Выводит надпись Go. Действует как клавиша Enter при наборе адреса в адресной строке браузера (IME_ACTION_GO)
- actionSearch: Выводит значок поиска (IME_ACTION_SEARCH)
- actionSend: Выводит надпись Send (IME_ACTION_SEND)
- actionNext: Выводит надпись Next (IME_ACTION_NEXT)
- actionDone: Выводи надпись Done (IME_ACTION_DONE)
Чтобы увидеть все варианты воочию, можете создать несколько текстовых полей и переключаться между ними:
Чтобы реагировать на нажатия разных состояний кнопки Enter, необходимо реализовать интерфейс TextView.OnEditorActionListener. Небольшой пример:
В нашем примере если пользователь ищет что-то, не связанное с котом, то кнопка поиска не будет выполнять желание владельца устройства.
Также можно поменять текст на кнопке с помощью атрибута android:imeActionLabel:
Текст на кнопке поменялся, но вот обработка Enter из предыдущего примера у меня перестала работать. Мой неработающий код на память.
Upd: Читатель Максим Г. предложил следующее решение проблемы. Убираем атрибуты imeOptions, imeActionId, imeActionLabel и установим их программно.
По желанию можете отслеживать только у нужного поля. Поставьте дополнительное условие после первого блока if:
Интерфейс OnKeyListener
Чтобы среагировать на нажатие клавиши внутри существующего представления из активности, реализуйте интерфейс OnKeyListener и назначьте его для объекта View, используя метод setOnKeyListener(). Вместо того, чтобы реализовывать отдельные методы для событий нажатия и отпускания клавиш, OnKeyListener использует единое событие onKey().
Используйте параметр keyCode для получения клавиши, которая была нажата. Параметр KeyEvent нужен для распознавания типа события (нажатие представлено константой ACTION_DOWN, а отпускание — ACTION_UP).
Сдвигаем активность
Чтобы всплывающая клавиатура не заслоняла элемент интерфейса, который получил фокус, а сдвигала активность вверх, можно в манифесте для нужной активности прописать атрибут android:windowSoftInputMode с параметром adjustPan:
Также доступны и другие параметры:
- stateUnspecified — настройка по умолчанию. Система сама выбирает подходящее поведение клавиатуры.
- stateUnchanged — клавиатура сохраняет своё последнее состояние (видимое или невидимое), когда активность с текстовым полем получает фокус.
- stateHidden — клавиатура скрыта, когда открывается активность. Клавиатура появится при наборе текста. Если пользователь переключится на другую активность, то клавиатура будут скрыта, но при возвращении назад клавиатура останется на экране, если она была видима при закрытии активности.
- stateAlwaysHidden — клавиатура всегда скрывается, если активность получает фокус.
- stateVisible — клавиатура видима.
- stateAlwaysVisible — клавиатура становится видимой, когда пользователь открывает активность.
- adjustResize — размеры компонентов в окне активности могут изменяться, чтобы освободить место для экранной клавиатуры.
- adjustPan — окно активности и его компоненты не изменяются, а сдвигаются таким образом, чтобы текстовое поле с фокусом не было закрыто клавиатурой.
- adjustUnspecified — настройка по умолчанию. Система сама выбирает нужный режим.
Параметры с префиксом state можно комбинировать с настройками с префиксом adjust:
Например, чтобы показать клавиатуру при старте активности, используйте stateVisible.
Данные настройки доступны и программно. Например, код для adjustResize:
Кстати, этот код не сработает в полноэкранном режиме (флаг FLAG_FULLSCREEN). Сверяйтесь с документацией.
Узнать выбранный язык на клавиатуре
Для определения текущего языка на клавиатуре можно использовать следующий код.
Следует быть осторожным с примером. На эмуляторе с Android 6.0 пример работал корректно. На реальных устройствах у меня корректно определялся русский язык, но при переключении на английский язык выдавал пустую строку или значение «zz». В этом случае можно прибегнуть к условиям if и проверять ожидаемое значение.
Источник