Как реализовать функцию onBackPressed() во фрагментах?
Есть ли способ реализовать onBackPressed()
в Android Fragment аналогично тому, как это сделано в Android Activity?
Поскольку жизненный цикл Fragment не имеет onBackPressed()
. Есть ли какой-нибудь другой альтернативный метод, чтобы обойти onBackPressed()
во фрагментах Android 3.0?
418
20
Я решил таким образом переопределить
onBackPressed в деятельности. Все FragmentTransaction "являются" addToBackStack
перед коммитом:Я самое лучшее решение
РЕШЕНИЕ # НА JAVA
Создать простой интерфейс :
И в вашей деятельности
Наконец-то в ваш фрагмент:
РЕШЕНИЕ # КОТЛИН
1 - Создать Интерфейс
2 - подготовка вашей деятельности
3 - реализовать в вашей целевой фрагмент
Согласно ответу @HaMMeRed вот псевдокод, как это должно работать. Предположим, что ваша основная активность называется
BaseActivity
, которая имеет дочерние фрагменты (как в примере с либой SlidingMenu). Вот шаги:Сначала нам нужно создать интерфейс и класс, который реализует интерфейс, чтобы иметь общий метод.
Создайте интерфейс класса
OnBackPressedListener
.Создайте класс, реализующий навыки
OnBackPressedListener
.С этого момента мы будем работать над нашим кодом
BaseActivity
и его фрагментамиСоздайте частный слушатель поверх класса
BaseActivity
.создайте метод для установки слушателя в
BaseActivity
.в переопределении
onBackPressed
реализуйте что-то вроде этогов вашем фрагменте в
onCreateView
вы должны добавить наш слушательВуаля, теперь при щелчке назад во фрагменте вы должны поймать ваш пользовательский метод on back.
Этот работал для меня: https://stackoverflow.com/a/27145007/3934111
Если вам нужна такая функциональность, вам нужно переопределить ее в вашей активности, а затем добавить интерфейс
YourBackPressed
ко всем вашим фрагментам, который вы вызываете на соответствующем фрагменте всякий раз, когда нажата кнопка "Назад".Edit: Я'хотел бы дополнить свой предыдущий ответ.
Если бы я делал это сегодня, я бы использовал широковещательную рассылку, или, возможно, упорядоченную широковещательную рассылку, если я ожидаю, что другие панели будут обновляться в унисон с главной/основной панелью содержимого.
LocalBroadcastManager
в библиотеке поддержки может помочь с этим, и вы просто посылаете трансляцию вonBackPressed
и подписываетесь на ваши фрагменты, которым это важно. Я думаю, что Messaging является более развязанной реализацией и будет лучше масштабироваться, поэтому сейчас это моя официальная рекомендация по реализации. Просто используйте действиеIntent
's в качестве фильтра для вашего сообщения. Отправьте ваше вновь созданноеACTION_BACK_PRESSED
, отправьте его из вашей активности и слушайте его в соответствующих фрагментах.Все это легко реализовать и не будет функционировать оптимальным образом.
Фрагменты вызова метода onDetach, что будет делать эту работу.
ЭТО БУДЕТ ДЕЛАТЬ ЭТУ РАБОТУ.
Просто добавьте
addToBackStack
во время перехода между фрагментами, как показано ниже:Если вы напишите
addToBackStack(null)
, он обработает это сам, но если вы зададите тег, вы должны обработать его вручную.поскольку этот вопрос и некоторые ответы в течение пяти лет, позвольте мне поделиться своим решением. Это является продолжением и модернизацией в ответ от @oyenigun
Обновление: В нижней части этой статьи, я добавил альтернативную реализацию, используя абстрактный фрагмент расширения, которая выиграла'т связаны активность вообще, что будет полезным для тех, кто с более сложными фрагмент с участием иерархии вложенных фрагментов, которые требуют различных поведение.
Мне нужно, чтобы реализовать это, потому что некоторые фрагменты я использую еще меньше представлений, которые я хотел бы уволить с задней кнопки, такие как небольшие информационные видом, которые появляются, и т. д., Но это хорошо для тех, кто нуждается, чтобы переопределить поведение кнопки "Назад" внутри фрагментов.
Во-первых, определить интерфейс
Этот интерфейс, который я называю
Backable
(я'м сторонник именования), имеет один метод onBackPressed (), который должен вернуть
логическое значение. Мы должны применить логическое значение, потому что мы должны знать, если кнопки "назад" пресса "и поглощаемой" задняя событие. Возврат True означает, что он имеет, и никаких дальнейших действий не требуется, в противном случае - "ложь" говорит о том, что по умолчанию действие все равно должно иметь место. Этот интерфейс должен быть это'собственный файл с (желательно в отдельный пакет под названиеминтерфейсы
). Помните, разделяющей классы в пакеты-это хорошая практика.Во-вторых, найдите верхний фрагмент
Я создал метод, который возвращает объект последний "фрагмент" в резервную стопку. Я использую теги... если вы используете ID и#39;ы, внести необходимые изменения. У меня этот статический метод в служебный класс, который занимается навигацией государства, и т. д... Но, конечно, положить его там, где он лучше всего подходит вам. Для назидания, я'вэ положить мину в класс под названием
NavUtils
.Убедитесь, что задняя стека счетчик больше 0, в противном случае
ArrayOutOfBoundsException
могли быть выброшены во время выполнения. Если это'т больше 0, возвращается значение null. Мы'МР проверка на нулевое значение...В-третьих, внедрить в Фрагмент
Реализовать интерфейс Backable в зависимости от того фрагмента, где вам нужно переопределить поведение кнопки "Назад". Добавьте метод внедрения.
В onBackPressed()` переопределить, поставить любую логику нужно. Если вы хотите, чтобы кнопка Обратно в ** не поп-обратно стек (по умолчанию), возвратить правда**, что ваша задняя часть мероприятия была поглощена. В противном случае возвращает false.
И наконец, в ваших действиях...
Переопределить `метод onBackPressed () и добавить эту логику к нему:
Мы получаем текущий фрагмент в задней стеке, тогда мы делаем проверку на null и определить, если он реализует интерфейс Backable`. Если это произойдет, определить, если событие было поглощено. Если да, мы'вновь выполнена с onBackPressed () и может вернуться. В противном случае, относиться к ней как к нормальной Прессы и вызов супер метод.
Второй вариант, чтобы не привлекать к деятельности
Порой, вы не'т хотим, чтобы деятельность, чтобы справиться с этим на всех, и вы должны обращаться непосредственно внутри фрагмента. Но кто сказал, что вы можете'Т есть фрагменты с пресс-АПИ? Просто расширьте свой фрагмент в новый класс.
Создать абстрактный класс, который расширяет фрагмент и реализует представления.Интерфейс OnKeyListner`...
Как вы можете видеть, любой фрагмент, который расширяет
BackableFragment
автоматически захватить обратно кликов с помощью зрения.Интерфейс OnKeyListener. Просто вызвать метод абстрактного
onBackButtonPressed () изнутри реализовали метод onKey()с помощью стандартной логики различить нажатие кнопки "Назад". Если вам необходима регистрация нажатий клавиш, кроме кнопки Назад, просто будьте уверены, чтобы назвать "супер" метода при переопределении
onKey()` в ваш фрагмент, иначе вы'МР override поведение в абстракции.Простой в использовании, просто распространить и внедрить:
С onBackButtonPressed()
метод в супер классе является абстрактным, раз вы продлить необходимо реализовать
onBackButtonPressed(). Она возвращает значение
пустота, потому что это просто необходимо для выполнения действий внутри класса фрагмент, и не нужно реле поглощение пресс-вернемся к активности. **Убедитесь, что** вы называете активность
onBackPressed()` метод, если все, что вы'повторно делать с задней кнопки Не'т требует обработки, в противном случае, кнопки "Назад" будет отключен... а вы Дон'т, что хотите!Предупреждения Как вы можете видеть, это задает ключ слушателя к корневому представлению фрагмента, и мы'll необходимо, чтобы сфокусировать его. Если там замешаны редактирования текстов (или любой другой фокус-кража видом) в вашем фрагменте, который расширяет этот класс (или другие внутренние фрагменты или представления, которые имеют те же), вы'll необходимо обрабатывать отдельно. Там'ы хорошая статья на расширение полей EditText, чтобы потерять фокус на спину пресс.
Я надеюсь, что кто-то находит это полезным. Удачи в кодировании.
Решение очень простое:
`onBackPressed (), потому что фрагмент будет отделяться от активности.
По данным @стерлингового Диаз ответа я думаю, что он прав. Но некоторые ситуации будет неправильно. (исх. Поворот Экрана)
Так что, я думаю, мы могли бы определить, является ли
isRemoving()
для достижения цели.Вы можете написать его в onDetach()
или
onDestroyView()`. Это работа.Вы должны добавить интерфейс к вашему проекту, как показано ниже;
И потом, вы должны реализовать этот интерфейс на вашем фрагменте;
И вы можете запустить это событие onBackPressed под вашу деятельность onBackPressed событие, как показано ниже;
Ну, я сделал это так, и это работает для меня
Простой интерфейс
FragmentOnBackClickInterface.java
Пример реализации
MyFragment.java
тогда просто переопределить onBackPressed в деятельности
Если вы использовать EventBus, это, вероятно, гораздо более простое решение :
и в вашем классе деятельности можно определить :
BackPressedMessage.java это просто объект POJO-объект
Это супер чистый и нет интерфейс/превосходное качество исполнения.
Это лишь небольшой код, который будет делать трюк:
Надеюсь, что это помогает кто-то :)
это мое решение:
> и в Отрывок:
Как насчет использования onDestroyView()?
в вашем фрагменте добавить следующее, Не забудьте внедрить в MainActivity'с интерфейсом.
Очень короткий и сладкий ответ:
Объяснение весь сценарий моем случае:
Я FragmentA в класс MainActivity, Я открываю FragmentB от FragmentA (FragmentB является ребенок или вложенный фрагмент FragmentA)
Теперь, если вы хотите, чтобы перейти к FragmentA от FragmentB вы можете просто положить
getActivity().onBackPressed();
в FragmentB.Просто выполните следующие действия:
Всегда при добавлении фрагмента,
Затем в основной деятельности, переопределить
onBackPressed()
Для обработки кнопки "Назад" в вашем приложении,
Что's это!