Страница 1 из 1

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

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

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

	    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:

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

Добавлено: 29 мар 2013, 18:38
Foenix
Можно поискать по тегу
mFragment = getFragmentManager().findFragmentByTag("MyFrag");
if (mFragment != null && !mFragment.isDetached()) {...}
второе условие про isDetached может для тебя лишнее..

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

Добавлено: 29 мар 2013, 18:44
neoksi
Olivka писал(а):Можно поискать по тегу

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

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

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

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

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

Добавлено: 29 мар 2013, 19:13
rezak90
2) Если я его нахожу, то как мне получить его id в стеке, чтоб перейти на него?
немножко не правильное представление
таким образом ты можешь получить только объект фрагмента, а вот перейти это уже создать новую транзакцию и закомитить, нельзя просто со стека вытянуть фрагмент и "перейти/вернуться" на него, слово "стек" не просто так называется стеком

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

Добавлено: 29 мар 2013, 19:39
neoksi
В общем решение нашел, вот что получилось:

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

	    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();
	    }
Правда в нем есть один недостаток, если фрагмент в данный момент отображается, то в стек проскочит ещё одна копия. Нужно доработать и еще одну проверку добавить.

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

Добавлено: 29 мар 2013, 19:52
rezak90
то ли я изначально не понял задачу, то ли ты что то не то сделал... наверное первое

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

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

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

Добавлено: 29 мар 2013, 20:54
rezak90
то есть миновать предыдущий фрагмент по кнопке бэк и перейти на тот который хочется?

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

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

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

Добавлено: 29 мар 2013, 23:14
rezak90
Почему всем хочется что бы в андроиде можно было переходить куда угодно и откуда угодно, минуя архитектуру самой системы и рекомендации самих разработчиков. Это же не настольная ОС что бы можно клацать куда угодно. В IOS почему то это всё строго и никто не пытается выходить за рамки, а в Android надо что то изобретать.

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

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

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

Добавлено: 29 мар 2013, 23:47
rezak90
зачем управлять стеком, есть иэрархия и всё что было до этого по бэку клацается назад, никак это не могу объяснить заказчику каждый раз всем нужно чего то не реального и пиши потом велосипеды... эх пятница -(

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

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