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

-
Foenix
- Сообщения: 4201
- Зарегистрирован: 20 окт 2012, 12:01
Сообщение
Foenix » 29 мар 2013, 18:38
Можно поискать по тегу
mFragment = getFragmentManager().findFragmentByTag("MyFrag");
if (mFragment != null && !mFragment.isDetached()) {...}
второе условие про isDetached может для тебя лишнее..
-
neoksi
- Сообщения: 712
- Зарегистрирован: 26 июл 2012, 10:42
-
Контактная информация:
Сообщение
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
Сообщение
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 раз.
-
rezak90
- Сообщения: 3422
- Зарегистрирован: 26 июн 2012, 13:22
- Откуда: UA
-
Контактная информация:
Сообщение
rezak90 » 29 мар 2013, 19:13
2) Если я его нахожу, то как мне получить его id в стеке, чтоб перейти на него?
немножко не правильное представление
таким образом ты можешь получить только объект фрагмента, а вот перейти это уже создать новую транзакцию и закомитить, нельзя просто со стека вытянуть фрагмент и "перейти/вернуться" на него, слово "стек" не просто так называется стеком
R.id.team
Политика на форуме запрещена
-
neoksi
- Сообщения: 712
- Зарегистрирован: 26 июл 2012, 10:42
-
Контактная информация:
Сообщение
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
-
Контактная информация:
Сообщение
rezak90 » 29 мар 2013, 19:52
то ли я изначально не понял задачу, то ли ты что то не то сделал... наверное первое
R.id.team
Политика на форуме запрещена
-
neoksi
- Сообщения: 712
- Зарегистрирован: 26 июл 2012, 10:42
-
Контактная информация:
Сообщение
neoksi » 29 мар 2013, 20:19
rezak90 писал(а):то ли я изначально не понял задачу, то ли ты что то не то сделал... наверное первое
Задача была простая:
Если вызывается фрагмент, но он уже есть в обратном стеке, то перейти к нему через обратный стек, а не добавлять его.
-
rezak90
- Сообщения: 3422
- Зарегистрирован: 26 июн 2012, 13:22
- Откуда: UA
-
Контактная информация:
Сообщение
rezak90 » 29 мар 2013, 20:54
то есть миновать предыдущий фрагмент по кнопке бэк и перейти на тот который хочется?
R.id.team
Политика на форуме запрещена
-
neoksi
- Сообщения: 712
- Зарегистрирован: 26 июл 2012, 10:42
-
Контактная информация:
Сообщение
neoksi » 29 мар 2013, 21:15
rezak90 писал(а):то есть миновать предыдущий фрагмент по кнопке бэк и перейти на тот который хочется?
Ну да, при условии, что он уже присутствует в стеке.
-
rezak90
- Сообщения: 3422
- Зарегистрирован: 26 июн 2012, 13:22
- Откуда: UA
-
Контактная информация:
Сообщение
rezak90 » 29 мар 2013, 23:14
Почему всем хочется что бы в андроиде можно было переходить куда угодно и откуда угодно, минуя архитектуру самой системы и рекомендации самих разработчиков. Это же не настольная ОС что бы можно клацать куда угодно. В IOS почему то это всё строго и никто не пытается выходить за рамки, а в Android надо что то изобретать.
R.id.team
Политика на форуме запрещена
-
neoksi
- Сообщения: 712
- Зарегистрирован: 26 июл 2012, 10:42
-
Контактная информация:
Сообщение
neoksi » 29 мар 2013, 23:25
rezak90 писал(а):Почему всем хочется что бы в андроиде можно было переходить куда угодно и откуда угодно, минуя архитектуру самой системы и рекомендации самих разработчиков. Это же не настольная ОС что бы можно клацать куда угодно. В IOS почему то это всё строго и никто не пытается выходить за рамки, а в Android надо что то изобретать.
Ну уж извините, управление стеком отдали на усмотрение разработчикам. И возвращение по стеку нормализовать приходится вручную.

-
rezak90
- Сообщения: 3422
- Зарегистрирован: 26 июн 2012, 13:22
- Откуда: UA
-
Контактная информация:
Сообщение
rezak90 » 29 мар 2013, 23:47
зачем управлять стеком, есть иэрархия и всё что было до этого по бэку клацается назад, никак это не могу объяснить заказчику каждый раз всем нужно чего то не реального и пиши потом велосипеды... эх пятница -(
R.id.team
Политика на форуме запрещена
-
neoksi
- Сообщения: 712
- Зарегистрирован: 26 июл 2012, 10:42
-
Контактная информация:
Сообщение
neoksi » 30 мар 2013, 00:48
Если все идет по иерархии, то да. Но если пользователь может вызывать фрагменты из выпадающего меню ActionBar, а внутри фрагментов вызываются другие...
Все зависит от ситуации, самое главное, чтоб логично было для пользователя все.