- Back press android fragment
- Комментарии RSS по email OK
- Android – handle back press in Fragment
- BaseFragment
- BaseActivity
- MyFragment
- Do you want more?
- 10 Entrepreneurship Lessons Worth Thousands of Dollars
- Unique Czech words reflecting coronavirus now also with English explanations as Flashcard quiz in Vocabulary Miner
- Performance of built-in higher-order functions Map, Filter, Reduce, and flatMap vs. for-in loop in Swift
- Generate JSON key for Google Play deployment
- Invoice details
- Praha Office
- Brno Office
- Как реализовать onBackPressed () во фрагментах?
- JAVA SOLUTION
- КОТЛИН РЕШЕНИЕ
- 1 — Создать интерфейс
- 2 — Подготовьте свою деятельность
- 3 — Внедрите в свой целевой фрагмент
- BackPress handling in Android Fragments, The old and the new!
- Demonstrating the old way of implementing this and the new one-liner!
- The old:
- The new:
Back press android fragment
28 октября 2014
В Android-приложениях иногда требуется особым образом обработать нажатие кнопки back. Если у вас не используются фрагменты, всё просто. Перекрываем метод onBackPressed у Activity и делаем что нам нужно. Если же используются фрагменты и по нажатию back необходимо что-то поменять в фрагменте, обработку хочется сделать именно в нём.
Посмотрев ответы на эту тему на StackOverflow я был несколько удивлён. Предлагается либо ненадёжный способ через OnKeyListener , либо жёсткий хардкод. Попробуем сделать это более красиво и удобно.
Начнём с интерфейса для фрагментов. Готового в фреймворке нет, сделаем свой:
Далее перекроем метод onBackPressed в нашем FragmentActivity :
Вытаскиваем все фрагменты, которые у нас есть. Ищем первый попавшийся, который реализует наш интерфейс OnBackPressedListener . Тут можно было придумать что-то, чтобы работать с несколькими обработчиками, но чаще всего он один. Если есть фрагмент, который реализует OnBackPressedListener , вызываем его единственный метод. Если нет — обрабатываем back как обычно.
Ну и, наконец, сам фрагмент:
Плюс данного подхода в том, что можно, например, отнаследовать все наши activity от MyActivity и использовать OnBackPressedListener без каких-либо изменений в коде MyActivity .
Комментарии RSS по email OK
Александр, смотрю ты уже на Android перешел. Мобильная разработка всех поглощает? Или это просто хобби 🙂
Я не ограничиваю себя какой-то одной технологией или языком. В случае андройда это не хобби. Коммерческий проект.
Согласен. Я то в моб. разработке дальше ionicframework(cordova) не пошел пока.
Спасибо за ваш вариант. На основе вашего у меня родилось следующее решение:
Я новечек важно ваше мнение. Конструкция вроде работает. Но могут ли быть с ней проблемы?
Могут. Как минимум, стоит учитывать, что использоваться может более одного фрагмента в одном activity.
В ListActivity это выглядит примерно так:
А как такое сделать в ListFragment и обычном Activity?
Sam, а почему вы пишете «андроЙд»? Или вы с такой же ошибкой пишите слова «плазмоЙд», «гиперболоЙд», «стероЙд» и «планетоЙд»? Домашнее задание: попробуйте произнести вслух эти слова так, как они написаны — с буквой «Й». Постарайтесь при этом не завязать язык в узел.
Капитан О., описочка вышла. Кстати, произнести с «й» вполне получается и при этом ничего в узел не завязывается. Это сочетание звуков вполне характерно для английского.
Спасибо за статью! Очень наглядный пример как ловить onBackPressed в фрагментах)
Источник
Android – handle back press in Fragment
This article describes how our FragmentBack works under the hood. If you are looking for ready to use solution than it is much better to use this tiny (1.5 kB) library instead of doing it yourself. In addition to the functionality described here, in FragmentBack library, you can also define a priority for your fragments.
BaseFragment
The first step to create back-sensitive fragments is to define the interface that we can call to notify particular fragments about back-press. It contains only one method onBackPressed() which returns a value that indicates if back-press event was consumed by the fragment.
In this example, we use the base class, but you can define it via the interface as well.
BaseActivity
The next step is an activity with the overwritten Activity.onBackPressed() method. In its body, we list all fragments attached to activity and for this implementing our BaseFragment class/interface we notify them about the new back-press event. The notified fragment can indicate event consumption by returning true , in this case, we stop iterating and leave the method. If no fragment consumed the event we invoke standard Activity.onBackPressed() implementation to dismiss activity.
Now simply by extending this BaseActivity all back-press events will be propagated to all your BaseFragments placed in it.
MyFragment
The last step is to implement such back-sensitive fragment. There is nothing simpler, just extend/implement your BaseFragment class/interface and handle back-press events in onBackPressed() properly or just return false to ignore it.
Do you need more detailed help? Book a consultation:
Let’s chat about it
Do you want more?
We share the world of software development on our Instagram. Join us 🙂
We also tend to look for Android dev (iOS as well), but there are also chances for a project manager or a tester. Send us an e-mail: skoumal@skoumal.net.
10 Entrepreneurship Lessons Worth Thousands of Dollars
Instead of great success we have experienced great entrepreneurship lessons (for now). It also transformed me, a person who has …
Unique Czech words reflecting coronavirus now also with English explanations as Flashcard quiz in Vocabulary Miner
Project Čestina 2.0 covering a variety of the modern Czech language with its slangs and new words has joined …
Performance of built-in higher-order functions Map, Filter, Reduce, and flatMap vs. for-in loop in Swift
The most popular higher-order functions are map, filter, and reduce. We all use them since we think that syntax …
Generate JSON key for Google Play deployment
In order to allow our CI server to deploy applications on Google Play automatically, we have to generate the JSON …
Invoice details
SKOUMAL s.r.o.
Jaurisova 515/4, Praha 4, 140 00
IČ: 035 29 151
DIČ: CZ 035 29 151
Společnost je zapsána v obchodním rejstříku vedeném Městským soudem v Praze, oddíl C, vložka 233182. Identifikátor datové schránky: qpctc9u
Praha Office
Prvního Pluku 12, Praha 8 – Karlín, 186 00
Show on map
Brno Office
Jana Babáka 11, Brno – Královo pole, 512 00
Show on map
Источник
Как реализовать onBackPressed () во фрагментах?
Есть ли способ, которым мы можем реализовать onBackPressed() в Android Fragment аналогично тому, как мы реализуем в Android Activity?
Так как Фрагмент жизненного цикла не имеет onBackPressed() . Есть ли другой альтернативный способ перегрузки onBackPressed() фрагментов Android 3.0?
Я решил таким образом переопределить onBackPressed в Activity. Все FragmentTransaction это , addToBackStack прежде чем совершить:
На мой взгляд, лучшее решение:
JAVA SOLUTION
Создать простой интерфейс:
И в вашей деятельности
Наконец в вашем фрагменте:
КОТЛИН РЕШЕНИЕ
1 — Создать интерфейс
2 — Подготовьте свою деятельность
3 — Внедрите в свой целевой фрагмент
Согласно @HaMMeRed ответом здесь является псевдокод, как он должен работать. Допустим, называется ваша основная деятельность BaseActivity с дочерними фрагментами (как в примере с SlidingMenu lib). Вот шаги:
Сначала нам нужно создать интерфейс и класс, который реализует его интерфейс, чтобы иметь универсальный метод
Создать интерфейс класса OnBackPressedListener
Создать класс, который реализует навыки OnBackPressedListener
С этого момента мы будем работать над нашим кодом BaseActivity и его фрагментами.
Создайте частного слушателя на вершине своего класса BaseActivity
создать метод для установки слушателя в BaseActivity
в переопределении onBackPressed реализовать что-то подобное
в вашем фрагменте onCreateView вы должны добавить наш слушатель
Вуаля, теперь, когда ты щелкаешь обратно фрагментом, ты должен поймать свой метод на спине.
Если вам нужна такая функциональность, вам нужно переопределить ее в своей деятельности, а затем добавить YourBackPressed интерфейс для всех ваших фрагментов, который вы вызываете для соответствующего фрагмента при каждом нажатии кнопки «Назад».
Изменить: я хотел бы добавить свой предыдущий ответ.
Если бы я делал это сегодня, я бы использовал трансляцию или, возможно, заказанную трансляцию, если бы ожидал, что другие панели будут обновляться в унисон на панель основного / основного контента.
LocalBroadcastManager в библиотеке поддержки может помочь с этим, и вы просто отправляете трансляцию onBackPressed и подписываетесь на интересующие вас фрагменты. Я думаю, что Messaging является более изолированной реализацией и будет лучше масштабироваться, поэтому сейчас это будет моя официальная рекомендация по внедрению. Просто используйте Intent действие в качестве фильтра для вашего сообщения. отправьте только что созданное ACTION_BACK_PRESSED , отправьте его из своей деятельности и прослушайте в соответствующих фрагментах.
Ничто из этого не легко реализовать и не будет функционировать оптимальным образом.
У фрагментов есть вызов метода onDetach, который сделает эту работу.
ЭТО ДЕЛАЕТ РАБОТУ.
Если вы используете androidx.appcompat:appcompat:1.1.0 или выше, вы можете добавить OnBackPressedCallback к своему фрагменту, как показано ниже
Просто добавьте, addToBackStack пока вы переходите между фрагментами, как показано ниже:
если вы пишете addToBackStack(null) , он будет обрабатывать его сам, но если вы дадите тег, вы должны обработать его вручную.
Поскольку этому вопросу и некоторым ответам уже более пяти лет, позвольте мне поделиться своим решением. Это продолжение и модернизация в ответ от @oyenigun
ОБНОВИТЬ: В нижней части этой статьи я добавил альтернативную реализацию, использующую абстрактное расширение Fragment, которое вообще не будет включать Activity, что было бы полезно для любого с более сложной иерархией фрагментов, включающей вложенные фрагменты, которые требуют различного обратного поведения.
Мне нужно было реализовать это, потому что некоторые из фрагментов, которые я использую, имеют меньшие представления, которые я хотел бы отклонить с помощью кнопки «Назад», такие как небольшие информационные представления, которые появляются, и т. Д., Но это хорошо для всех, кому нужно переопределить поведение кнопка возврата внутри фрагментов.
Сначала определите интерфейс
Этот интерфейс, который я называю Backable (я сторонник соглашений об именах), имеет единственный метод, onBackPressed() который должен возвращать boolean значение. Нам нужно ввести логическое значение, потому что нам нужно будет знать, «нажата» ли кнопка «назад», «поглотила» ли она событие назад. Возврат true означает, что он есть, и никаких дальнейших действий не требуется, в противном случае он false говорит, что обратное действие по умолчанию все еще должно иметь место. Этот интерфейс должен быть его собственным файлом (желательно в отдельном названном пакете interfaces ). Помните, что разделение ваших классов на пакеты — это хорошая практика.
Во-вторых, найдите верхний фрагмент
Я создал метод, который возвращает последний Fragment объект в заднем стеке. Я использую теги . если вы используете ID, внесите необходимые изменения. У меня есть этот статический метод в служебном классе, который имеет дело с состояниями навигации и т. Д., Но, конечно, поместите его там, где он вам больше подходит. Для назидания я поместил свой класс в класс NavUtils .
Удостоверьтесь, что число обратных стеков больше 0, иначе ArrayOutOfBoundsException может быть выброшено во время выполнения. Если оно не больше 0, вернуть ноль. Мы проверим нулевое значение позже .
В-третьих, реализовать в фрагменте
Реализуйте Backable интерфейс в любом фрагменте, где вам нужно переопределить поведение кнопки «Назад». Добавьте метод реализации.
В onBackPressed() переопределении поместите любую логику, которая вам нужна. Если вы хотите, чтобы кнопка «Назад» не вставляла задний стек (поведение по умолчанию), верните true , чтобы событие «Назад» было поглощено. В противном случае верните false.
Наконец, в вашей деятельности .
Переопределите onBackPressed() метод и добавьте к нему следующую логику:
Мы получаем текущий фрагмент в заднем стеке, затем делаем нулевую проверку и определяем, реализует ли он наш Backable интерфейс. Если это так, определите, было ли событие поглощено. Если это так, мы закончили onBackPressed() и можем вернуться. В противном случае рассматривайте это как обычное нажатие назад и вызывайте метод super.
Второй вариант — не привлекать активность
Иногда вы не хотите, чтобы Activity обрабатывал это вообще, и вам нужно обрабатывать это непосредственно внутри фрагмента. Но кто сказал, что у вас не может быть фрагментов с API для обратной печати? Просто расширьте свой фрагмент до нового класса.
Создайте абстрактный класс, который расширяет Fragment и реализует View.OnKeyListner интерфейс .
Как вы можете видеть, любой фрагмент, который расширяется, BackableFragment будет автоматически захватывать обратные клики, используя View.OnKeyListener интерфейс. Просто вызовите абстрактный onBackButtonPressed() метод из реализованного onKey() метода, используя стандартную логику, чтобы распознать нажатие кнопки назад. Если вам нужно зарегистрировать нажатия клавиш, отличные от кнопки «Назад», просто вызовите super метод при переопределении onKey() вашего фрагмента, иначе вы переопределите поведение в абстракции.
Прост в использовании, просто расширьте и внедрите:
Поскольку onBackButtonPressed() метод в суперклассе является абстрактным, после расширения вы должны реализовать его onBackButtonPressed() . Он возвращается, void потому что ему просто нужно выполнить действие внутри класса фрагмента, и ему не нужно ретранслировать поглощение прессы обратно в Activity. Убедитесь, что вы вызываете onBackPressed() метод Activity, если все, что вы делаете с кнопкой «назад», не требует обработки, в противном случае кнопка «Назад» будет отключена . и вам это не нужно!
Предостережения Как вы можете видеть, это устанавливает ключевой слушатель на корневой вид фрагмента, и нам нужно сфокусировать его. Если в вашем фрагменте, который расширяет этот класс (или в других внутренних фрагментах или представлениях, имеющих одинаковые значения), есть тексты редактирования (или любые другие представления для кражи фокуса), вам придется обрабатывать это отдельно. Есть хорошая статья о расширении EditText, чтобы потерять фокус на спине.
Я надеюсь, что кто-то найдет это полезным. Удачного кодирования.
Источник
BackPress handling in Android Fragments, The old and the new!
Demonstrating the old way of implementing this and the new one-liner!
One of the nice things that recently was introduced in the Android world in devSummit19 was the new way of handling back presses in the fragments which always was a bit of pain to implement. Previously if a fragment let’s say a SearchFragment needed to respond to back press events and close the SearchView, we had to go through all the steps as below:
The old:
1-We should’ve had an interface as:
2- All the fragments willing to intercept the BackPress event had to implement the interface above which caused them having the onBackPressed() function call. Now the fragment can respond to BackPress events and do something and based on if the event was consumed or not they can return true or false.
3-Now it’s the time to connect the dots and override the Activity’s OnBackPressed() function to implement the logic, We needed to get the current fragment from “ fragmentManager” and examine if it was of type BackPressHandler and if so we should’ve executed the onBackPressed() function on that particular fragment and checked the response, If it was returning false, meaning that they were not interested in consuming the event then the next move was to call super.onBackPressed() or do specific logic in the activity, but if it returned true then it means that the fragment has consumed the event and we should skip executing the logic in Activity’s onBackPressed(), Let’s see how it is done in Action:
and If you’re wondering what’s inside getTopFragment extension function:
The new:
As you can see it was a lot of work just for a simple thing to do, Now with the new way of doing this we only need to add the code below on the Fragment’s onCreate() method:
From now on all the back press events will be captured by handleOnBackPressed() method and your fragments will have the opportunity to react to Back Press events. but what about the times that we’re not sure that we need to consume the back press event? The times that we just need to check some condition and if they apply then do some action? In those cases we can set the isEnabled variable to false and call the onBackPressed() method on activity again manually:
Источник