Фрагменты и обратный стек

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Фрагменты и обратный стек

Сообщение neoksi » 29 мар 2013, 18:32

Вожусь с фрагментами и возник следующий вопрос по работе со стеком.
При смене фрагментов, если я в метод передал имя фрагмента, то я добавляю его в стек обратного вызова:

Код: Выделить всё

	    public void replaceFragment(Fragment fragment, String backStackName) {
	    	// TODO смена фрагментов с запоминанием в стек
	    	// Создаем объект транзаксации
	        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();	
	        // Указываем где и на какой фрагмент менять
	        ft.replace(R.id.content, fragment);
	        if (backStackName != null) {
	        	// Если есть имя, то добавляем в стек обратного вызова
	            ft.addToBackStack(backStackName);
	        }
	        // Устанавливаем эффект смены фрагментов
	        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
	        // Производим смену фрагментов
	        ft.commit();
	    }
И тут у меня возник вопрос, а можно ли проверить стек на существование в нем по имени записи и перейти к ней? То есть, если фрагмент уже есть в стеке и его опять вызвали, то я хочу к нему перейти через стек. :roll:

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Фрагменты и обратный стек

Сообщение Foenix » 29 мар 2013, 18:38

Можно поискать по тегу
mFragment = getFragmentManager().findFragmentByTag("MyFrag");
if (mFragment != null && !mFragment.isDetached()) {...}
второе условие про isDetached может для тебя лишнее..
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Фрагменты и обратный стек

Сообщение neoksi » 29 мар 2013, 18:44

Olivka писал(а):Можно поискать по тегу

Код: Выделить всё

			mFragment = getFragmentManager().findFragmentByTag("MyFrag");
			if (mFragment != null && !mFragment.isDetached()) {...}
второе условие про isDetached может для тебя лишнее..
1) Тобишь, то что я назвал Именем, является тегом?
2) Если я его нахожу, то как мне получить его id в стеке, чтоб перейти на него?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Фрагменты и обратный стек

Сообщение Foenix » 29 мар 2013, 19:12

нет, нужно теги назначать..
там setTag() или как-то так (просто ум еян пример другой, там фрагменты как табы выступают
bar.addTab(bar.newTab().setText("еее")
.setTabListener(new TabListener<TToolsNetworkFragment>(this, "network", TToolsNetworkFragment.class)));
там тег как параметр идет..
перейти по тэгу можно FindFragmentByTag и потом сделать его активным
Последний раз редактировалось Foenix 29 мар 2013, 19:14, всего редактировалось 1 раз.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Фрагменты и обратный стек

Сообщение rezak90 » 29 мар 2013, 19:13

2) Если я его нахожу, то как мне получить его id в стеке, чтоб перейти на него?
немножко не правильное представление
таким образом ты можешь получить только объект фрагмента, а вот перейти это уже создать новую транзакцию и закомитить, нельзя просто со стека вытянуть фрагмент и "перейти/вернуться" на него, слово "стек" не просто так называется стеком
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Фрагменты и обратный стек

Сообщение neoksi » 29 мар 2013, 19:39

В общем решение нашел, вот что получилось:

Код: Выделить всё

	    public void replaceFragment(Fragment fragment, String backStackName) {
	    	// TODO смена фрагментов с запоминанием в стек
	    	// Создаем объект Менеджера фрагментов
	    	FragmentManager fm = getSupportFragmentManager();
	    	// Проверяем наличие фрагмента в стеке
	    	if (backStackName != null) {
	    		if(fm.popBackStackImmediate(backStackName, 0)){
	    			// Если есть фрагмент в стеке, то мы уже переведены на него, выходим.
	    			return;
	    		}	    		
	    	}
	    	// Создаем объект транзаксации	    	
	        FragmentTransaction ft = fm.beginTransaction();	
	        // Указываем где и на какой фрагмент менять
	        ft.replace(R.id.content, fragment);
	        if (backStackName != null) {
	        	// Если есть имя, то добавляем в стек обратного вызова
	            ft.addToBackStack(backStackName);
	        }
	        // Устанавливаем эффект смены фрагментов
	        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
	        // Производим смену фрагментов
	        ft.commit();
	    }
Правда в нем есть один недостаток, если фрагмент в данный момент отображается, то в стек проскочит ещё одна копия. Нужно доработать и еще одну проверку добавить.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Фрагменты и обратный стек

Сообщение rezak90 » 29 мар 2013, 19:52

то ли я изначально не понял задачу, то ли ты что то не то сделал... наверное первое
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Фрагменты и обратный стек

Сообщение neoksi » 29 мар 2013, 20:19

rezak90 писал(а):то ли я изначально не понял задачу, то ли ты что то не то сделал... наверное первое
Задача была простая:
Если вызывается фрагмент, но он уже есть в обратном стеке, то перейти к нему через обратный стек, а не добавлять его.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Фрагменты и обратный стек

Сообщение rezak90 » 29 мар 2013, 20:54

то есть миновать предыдущий фрагмент по кнопке бэк и перейти на тот который хочется?
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Фрагменты и обратный стек

Сообщение neoksi » 29 мар 2013, 21:15

rezak90 писал(а):то есть миновать предыдущий фрагмент по кнопке бэк и перейти на тот который хочется?
Ну да, при условии, что он уже присутствует в стеке.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Фрагменты и обратный стек

Сообщение rezak90 » 29 мар 2013, 23:14

Почему всем хочется что бы в андроиде можно было переходить куда угодно и откуда угодно, минуя архитектуру самой системы и рекомендации самих разработчиков. Это же не настольная ОС что бы можно клацать куда угодно. В IOS почему то это всё строго и никто не пытается выходить за рамки, а в Android надо что то изобретать.
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Фрагменты и обратный стек

Сообщение neoksi » 29 мар 2013, 23:25

rezak90 писал(а):Почему всем хочется что бы в андроиде можно было переходить куда угодно и откуда угодно, минуя архитектуру самой системы и рекомендации самих разработчиков. Это же не настольная ОС что бы можно клацать куда угодно. В IOS почему то это всё строго и никто не пытается выходить за рамки, а в Android надо что то изобретать.
Ну уж извините, управление стеком отдали на усмотрение разработчикам. И возвращение по стеку нормализовать приходится вручную. :(

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Фрагменты и обратный стек

Сообщение rezak90 » 29 мар 2013, 23:47

зачем управлять стеком, есть иэрархия и всё что было до этого по бэку клацается назад, никак это не могу объяснить заказчику каждый раз всем нужно чего то не реального и пиши потом велосипеды... эх пятница -(
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Фрагменты и обратный стек

Сообщение neoksi » 30 мар 2013, 00:48

Если все идет по иерархии, то да. Но если пользователь может вызывать фрагменты из выпадающего меню ActionBar, а внутри фрагментов вызываются другие...
Все зависит от ситуации, самое главное, чтоб логично было для пользователя все.

Ответить