- Полный список
- Android Fragment Back Stack Example
- 1. Fragment Back Stack Example.
- Фрагмент Android-транзакции: FragmentManager и Backstack
- FragmentManager
- Фрагмент Backstack
- Android Fragments BackStack Tutorial With Example Programmatically
- Download Source Code For Android Fragments Example
- Step 1: Create a new project in Android Studio.
- Step 2: Creating Two Fragments
- Step 3: Making BackStack Activity
- Step 4: Description of BackStackActivity
- Step 5: Updating MainActivity
- Step 6: Description of MainActivity
- Kotlin Version
- 2 thoughts on “Android Fragments BackStack Tutorial With Example Programmatically”
Полный список
— динамически работаем с фрагментами
Размещать статические фрагменты мы уже умеем. Но, ясно дело, что гораздо интереснее работать с ними динамически. Система позволяет нам добавлять, удалять и заменять фрагменты друг другом. При этом мы можем сохранять все эти манипуляции в BackStack и кнопкой Назад отменять. В общем, все удобно и красиво.
Создадим простое приложение с двумя фрагментами, которое будет уметь:
— добавлять первый фрагмент
— удалять первый фрагмент
— заменять первый фрагмент вторым фрагментом
— переключать режим сохранения в BackStack операций с фрагментами
Project name: P1051_FragmentDynamic
Build Target: Android 4.1
Application name: FragmentDynamic
Package name: ru.startandroid.develop.p1051fragmentdynamic
Create Activity: MainActivity
В strings.xml добавим строки:
Создаем фрагменты. Как мы помним из прошлого урока, для этого нам нужны будут layout-файлы и классы, наследующие android.app.Fragment
Все почти аналогично прошлому уроку, только убрали вызовы кучи lifecycle методов с логами.
Рисуем основное Activity.
Три кнопки для добавления, удаления и замены фрагментов. Чекбокс для включения использования BackStack. И FrameLayout – это контейнер, в котором будет происходить вся работа с фрагментами. Он должен быть типа ViewGroup. А элементы Fragment, которые мы использовали на прошлом уроке для размещения фрагментов, нам не нужны для динамической работы.
В onCreate создаем пару фрагментов и находим чекбокс.
В onClick мы получаем менеджер фрагментов с помощью метода getFragmentManager. Этот объект является основным для работы с фрагментами. Далее, чтобы добавить/удалить/заменить фрагмент, нам необходимо использовать транзакции. Они аналогичны транзакциям в БД, где мы открываем транзакцию, производим операции с БД, выполняем commit. Здесь мы открываем транзакцию, производим операции с фрагментами (добавляем, удаляем, заменяем), выполняем commit.
Итак, мы получили FragmentManager и открыли транзакцию методом beginTransaction. Далее определяем, какая кнопка была нажата:
если Add, то вызываем метод add, в который передаем id контейнера (тот самый FrameLayout из main.xml) и объект фрагмента. В итоге, в контейнер будет помещен Fragment1
если Remove, то вызываем метод remove, в который передаем объект фрагмента, который хотим убрать. В итоге, фрагмент удалится с экрана.
если Replace, то вызываем метод replace, в который передаем id контейнера и объект фрагмента. В итоге, из контейнера удалится его текущий фрагмент (если он там есть) и добавится фрагмент, указанный нами.
Далее проверяем чекбокс. Если он включен, то добавляем транзакцию в BackStack. Для этого используем метод addToBackStack. На вход можно подать строку-тэг. Я передаю null.
Ну и вызываем commit, транзакция завершена.
Давайте смотреть, что получилось. Все сохраняем, запускаем приложение.
появился первый фрагмент.
Еще раз добавим первый фрагмент – жмем Add. И жмем Replace
первый фрагмент заменился вторым.
Жмем кнопку Назад. Приложение закрылось, т.к. все эти операции с фрагментами не сохранялись в BackStack. Давайте используем эту возможность.
Снова запускаем приложение и включаем чекбокс add to Back Stack
Выполняем те же операции: Add, Remove, Add, Replace. У нас добавится первый фрагмент, удалится первый фрагмент, добавится первый фрагмент, заменится вторым. В итоге мы снова видим второй фрагмент. Теперь жмем несколько раз кнопку Назад и наблюдаем, как выполняются операции, обратные тем, что мы делали. Когда транзакции, сохраненные в стеке закончатся, кнопка Назад закроет приложение.
Т.е. все достаточно просто и понятно. Скажу еще про пару интересных моментов.
Я в этом примере выполнял всего одну операцию в каждой транзакции. Но, разумеется, их может быть больше.
Когда мы удаляем фрагмент и не добавляем транзакцию в BackStack, то фрагмент уничтожается. Если же транзакция добавляется в BackStack, то, при удалении, фрагмент не уничтожается (onDestroy не вызывается), а останавливается (onStop).
В качестве самостоятельной работы: попробуйте немного изменить приложение и добавлять в один контейнер сразу два фрагмента. Возможно, результат вас удивит )
На следующем уроке:
— рассмотрим взаимодействие между Activity и ее фрагментами
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
Android Fragment Back Stack Example
Android OS provides a back stack function for Activity, it also provides the back stack function for Fragment. If you add one Fragment into the back stack, when you press the android device back menu, you can find the Fragment that is saved in the back stack popup. Until all the saved Fragments in the back stack popup, then the activity will exit.
1. Fragment Back Stack Example.
- This example contains one activity and three fragments.
- Each fragment includes a button and an input text box.
- When clicking the button it will either show a hidden or create a new target fragment.
- When clicking the back menu, the stacked fragments will be popup by order, if the fragment is hidden in the stack ( fragment two ), then the text in the input box will be saved also.
- If the fragment is replaced in the stack ( fragment one ), because the replace action will delete the previous fragment ( fragment one ) and then add a new fragment ( fragment two ), so the input text in the previous fragment will not be saved.
- You can use the below code to put a fragment into the back stack.
- If you click the “Go To Fragment One” button in Fragment three, because Fragment one is at the bottom of the back stack, so it will remove all the above Fragments in the back stack and show Fragment One again.
- So when you go to Fragment Two again, you will find the input text disappear because it is newly created.
Источник
Фрагмент Android-транзакции: FragmentManager и Backstack
Фрагменты полезны, когда мы хотим поддерживать несколько размеров экрана . Для управления фрагментами нам нужен FragmentManager, который помогает нам обрабатывать транзакции между фрагментами. Под транзакцией мы подразумеваем последовательность шагов для добавления, замены или удаления фрагментов . В последнем посте мы показали, как поддерживать несколько размеров экрана и ориентацию с использованием фрагментов . Теперь мы хотим пойти немного дальше.
В Android есть два разных способа создания фрагмента:
- статический метод
- динамический метод
Статический метод — это когда мы «записываем» непосредственно наш фрагмент в файл XML. Это пример:
В этом случае наш макет не является динамическим, потому что мы не можем управлять фрагментом во время выполнения. Поэтому, если мы хотим сделать наш макет динамичным (а это происходит очень часто), нам нужно сделать это по-другому. Мы должны использовать FrameLayout. С FrameLayout мы можем обрабатывать фрагменты так, как нам нужно во время выполнения, но для этого нам нужен менеджер, другими словами, компонент, который может обрабатывать фрагменты. Это FragmentManager . Этот компонент может добавлять , заменять и удалять фрагменты во время выполнения. Расположение выше становится:
Так что теперь у нас есть свобода « вставлять » в FrameLayout наши фрагменты.
FragmentManager
Как мы уже говорили, FragmentManager является ключевым компонентом. Используя FragmentManager, мы можем обнаружить ( найти ) фрагмент внутри нашего макета, используя findFragmentById или findFragmentByTag . В то время как первый метод очень прост, и мы используем общий идентификатор Android для обнаружения компонента, второй метод (который использует тег) является необычным. Тег во фрагменте — это просто «имя», которое мы даем фрагменту, чтобы мы могли найти его позже, используя это имя. Нас больше интересуют некоторые другие методы.
Вся операция, выполняемая FragmentManager, происходит внутри «транзакции», как в операции с базой данных. Во-первых, мы можем получить FragmentManger, используя метод Activity getFragmentManager () . Получив ссылку на этот компонент, мы должны начать транзакцию следующим образом:
В конце, когда мы закончили, и мы готовы показать наш фрагмент, мы должны вызвать метод commit, который отмечает конец транзакции. Например, если мы помним пример, который мы показали в предыдущем посте, и используя FrameLayout, мы можем «вставить» список ссылок следующим образом:
Но … Какую операцию мы можем выполнить внутри транзакции? … Ну, мы можем:
- добавить новый фрагмент
- заменить существующий фрагмент
- удалить фрагмент
Если мы помним пример, который мы использовали в прошлый раз каждый раз, когда пользователь нажимает на ссылку, вызывается метод интерфейса onLinkChange . Таким образом, в этом методе мы хотим показать, как выполнить операцию, перечисленную выше.
Если вы сравните этот фрагмент кода с последним примером в предыдущем посте, вы заметите некоторые различия. Сначала в зеленой части мы больше не запускаем действие, когда пользователь нажимает на ссылку, а просто заменяем FrameLayout фрагментом, показывающим веб-страницу. Более того, в желтой части мы не обновляем текущий фрагмент внутри FrameLayout, но создаем новый фрагмент и заменяем существующий фрагмент только что созданным. Поведение приложения всегда одинаково, но мы получили это поведение по-другому, используя динамические фрагменты внутри нашего макета.
Если вы запустите приложение и начнете его использовать, вы можете заметить «проводное» поведение при нажатии кнопки «Назад». Мы ожидаем, что кнопка «Назад» приведет нас к последней посещенной веб-странице, но это не так, как мы предполагали. Когда вы нажимаете кнопку «Назад», вы попадаете на домашнюю страницу.
Фрагмент Backstack
Поведение, описанное выше, является нормальным, поскольку кнопка «Назад» действует на уровне активности, а не на уровне фрагмента. Таким образом, наша деятельность остается неизменной, пока мы заменяем фрагменты, когда пользователь взаимодействует с приложением. Таким образом, когда мы нажимаем кнопку «Назад», мы выбираем первое действие в стеке действий, в нашем случае — домашнее. Нам не нужно такое поведение, но мы хотим, чтобы при нажатии кнопки «Назад» мы возвращались в стек фрагментов. Мы можем добиться этого, добавив фрагмент в backstack . Мы делаем это следующим образом:
Источник
Android Fragments BackStack Tutorial With Example Programmatically
Hello, all. Welcome to Android Fragments tutorial for beginners.
In Android fragments example, you will learn how to create a basic fragment with a simple example and source code.
You will learn how to create maintain multiple fragments in one activity.
We will see how to handle and manage backstack of fragments.
Android Studio will be used to make android fragments tutorial with example.
First, check the output of Android fragments example, then we will develop it.
Download Source Code For Android Fragments Example
Step 1: Create a new project in Android Studio.
Make a new project in android studio. Consider a main activity as empty activity.
Step 2: Creating Two Fragments
Make two new fragments and give them name as “OneFragment” and “TwoFragment.”
Add below code in OneFragment.java
Paste following source code in fragment_one.xml
Add below code in TwoFragment.java
Copy following in fragment_two.xml
Step 3: Making BackStack Activity
Create a new activity named “BackStackActivity.”
Copy following in activity_back_stack.xml
Add below in BackStackActivity.java
Step 4: Description of BackStackActivity
Below method is used to create a fragment.
In the second parameter, a boolean variable “addToBackStack” is passed.
If addToBackStack is true then, the fragment will be saved in back stack. That means when a user clicks on the back button all the fragments present in backstack will be set in container_frame as per its order.
Step 5: Updating MainActivity
Add below to activity_main.xml
Add following in MainActivity.java
Step 6: Description of MainActivity
Following method is used to open fragment.
Same as in BackStackActivity, a boolean addToBackStack variable is passed in the second parameter.
Here it is false, so if a user clicks back button, the app will be closed because nothing was saved in the backstack.
Kotlin Version
So that is all for Fragments Android example.
Feel free to comment your queries and reviews in the comment section. Thank you.
2 thoughts on “Android Fragments BackStack Tutorial With Example Programmatically”
is there any way when click on button 2 that open google maps avoid that the fragment open the google maps oncreate everytime? Im asking because Im doing something exactly like yours example, fragment 1 will be one screen to user choose some options and when user clique um button calls other fragment, I’ve done it, everything is working well, but everytime I call the second fragment with google maps, I see that google maps on create is been fired each time, doing this google is asking 10 times if the user comeback to filter fragment, Im trying to avoid this, any idea?
Источник