Страница 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();
}
И тут у меня возник вопрос, а можно ли проверить стек на существование в нем по имени записи и перейти к ней? То есть, если фрагмент уже есть в стеке и его опять вызвали, то я хочу к нему перейти через стек.

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, а внутри фрагментов вызываются другие...
Все зависит от ситуации, самое главное, чтоб логично было для пользователя все.