Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
dimchel
0 / 0 / 0
Регистрация: 30.10.2012
Сообщений: 10
1

Как получить доступ к устаревшим фрагментам после чистки кеша

06.11.2014, 11:28. Просмотров 718. Ответов 10
Метки нет (Все метки)

Доброго времени суток. Во время написания приложения возникла данная проблема.
Возникает она когда пользователь свернув мое приложение включает Clean Master и чистит кеш (ускоряет систему).
У меня имеется LinearLayout на который я добавляю фрагменты с картинками
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<HorizontalScrollView
                android:id="@+id/horizontalScrollView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true" >
    
                <LinearLayout
                    android:id="@+id/containerImages"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal" >
                </LinearLayout>
            </HorizontalScrollView>
Вот методы добавления и удаления фрагметов с картинками в этот layout:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public static void createImageFragment(FragmentManager fragmentManager, Image _image)
    {
        Log.v("gg", "создаем картинку" + imageLayout.getChildCount());
        
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();
        
        imageFragments.add(new ImageFragment());
        
        imageFragments.get(imageFragments.size() - 1).image = _image;
        
        fragmentTransaction.add(R.id.containerImages, imageFragments.get(imageFragments.size() - 1));
        fragmentTransaction.commit();
        Log.v("gg", "создаем картинку" + imageLayout.getChildCount());  
    }
    
    public static void removeAllFragments(FragmentManager fm)
    {
        if (AppDataManager.editIndex != -1)
        {
            FragmentTransaction ft = fm.beginTransaction();
            for (int i = 0; i < AppDataManager.items.get(AppDataManager.editIndex).getImages().size(); i++)
            {
                Fragment oldFragment = fm.findFragmentById(R.id.containerImages);
                if (oldFragment != null) 
                {
                    ft.remove(oldFragment);
                }
            }
 
            ft.commit();
        }
    }
Вот так выглядит linearLayout с картинками:
После того как пользователь почистил телефон клин мастером, то мое приложение перезапускается и возвращается в то состояние, в котором находилось до чистки, все отрабатывает правильно, но в linearLayout остаются старые фрагменты, которые я добавил и я не могу больше обратиться к ним чтобы удалить их или вообще очистить этот layout от них:

Как мне очищать этот linearLayout от всех фрагментов находящихся в нем чтобы заново создать новые?

P.S: к сожалению я так и не нашел как здесь добавить картинку и мои URL тоже не отображаются, надеюсь вы поймете мою проблему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2014, 11:28
Ответы с готовыми решениями:

Как получить доступ к фрагментам?
пытаюсь написать приложение. в которм будет несколько страниц со списками...

Как получить доступ к сервису?
У меня в приложении есть сервис, который запускается вместе с приложением....

Как получить доступ к тексту SMS?
Тость хочу чтоб когда выскакивает меню набора текста SMS я мог бы туда при...

Как получить доступ к root файлу
Всем привет. Допустим есть файл, его не видно без доступа к root. Как получить...

Как получить доступ к элементу в папке по имени?
Есть, допустим, следующий код Bitmap srcBitmapLocal =...

10
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,733
06.11.2014, 11:59 2
dimchel, для того чтобы добавить рисунки, надо либо при создании темы прокрутить вниз и нажать кнопку "Управление вложениями", либо при ответе нажать "Расширенный режим" и потом нажать "Управление вложениями".
Мне тоже интересна эта тема, раньше тоже развлекался над чужими приложениями, выполняя данные действия. Не все приложения после Clean Master'а выживали. С фрагментами достаточно много багов, связанных с удалением активностей и их пересозданием. Я пока что не могу подсказать. Использую метод setRetainInstance(true) в onCreate во фрагментах.
А что не так у вас в приложении? Если пользователь перезайдёт в программу, то всё нормально?

Добавлено через 3 минуты
Недавно читал тему http://www.androiddesignpatterns.com...g-changes.html. Там рекомендуют вообще следить за состоянием активностей и пересоздавать их с нуля с восстановлением всех данных. В stackoverflow также указывается, что FragmentTransaction живёт своей жизнью и не подчиняется общим правилам пересоздания активностей. А потому, наверное, проблема в нём.
0
dimchel
0 / 0 / 0
Регистрация: 30.10.2012
Сообщений: 10
06.11.2014, 12:06  [ТС] 3
Программа работает со списком объектов недвижимости, там есть панель редактирования объекта где отображается горизонтальный список картинок (это фрагменты, где есть сама картинка и кнопка "удалить"). Когда пользователь открывает панель редактирования - то так появляются картинки этого объекта (если они имеются), пользователь может добавлять и удалять их по своему усмотрению. Все работает правильно, когда я закрываю фрагмент редактирования я удаляю все фрагменты с картинками, когда я открываю его, то создаю их заново. Но когда пользователь свернул приложение и почистил все клинером, то старые фрагменты с картинками не удаляются так как не вызываются методы onDestroy onDestroyView и из-за этого остаются старые фрагменты без картинок, так как картинки не кешируются.
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,733
06.11.2014, 12:58 4
dimchel, попробуйте использовать другие события, в Log выводите, что происходит при чистке Cleaner'ом. Вот модель событий: http://developer.android.com/guide/components/fragments.html
Попробуйте onStop. Вызывается ли повторно событие onCreateView? Вызывается ли onActivityCreated?
0
dimchel
0 / 0 / 0
Регистрация: 30.10.2012
Сообщений: 10
06.11.2014, 13:21  [ТС] 5
Я уже пробовал, в момент чистки клинером не вызываются никакие методы и я не знаю как отследить это событие, а когда я разворачиваю приложение, то там заново вызываются onCreateView и onActivityCreated.
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,733
06.11.2014, 14:19 6
dimchel, хорошо. А почему тогда при onCreateView картинки не пересоздаются, я не совсем понимаю?
Может быть, в onCreate фрагмента поставить setRetainInstance(false)? Или снять со стека все фрагменты из fragmentTransaction (только я не знаю, как определить момент, что их оттуда надо убрать).
0
dimchel
0 / 0 / 0
Регистрация: 30.10.2012
Сообщений: 10
06.11.2014, 16:49  [ТС] 7
У меня такие же вопросы
setRetainInstance(false) - не работает.
У fragmentTransaction я не нашел таких методов
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
06.11.2014, 16:59 8
Цитата Сообщение от dimchel Посмотреть сообщение
Log.v("gg", "создаем картинку" + imageLayout.getChildCount());
А вот тут что пишет в лог? При нормальном поведении и после чистки? При первой итерации.

Добавлено через 3 минуты
И еще у вас на imageLayuot только эти фрагменты находятся? Никаких дополнительных элементов нет?
0
dimchel
0 / 0 / 0
Регистрация: 30.10.2012
Сообщений: 10
06.11.2014, 17:30  [ТС] 9
Лог пишет 0 всегда, до и после добавления фрагментов.
На imageLayout у меня только фрагменты с картинками.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
06.11.2014, 17:35 10
Цитата Сообщение от dimchel Посмотреть сообщение
На imageLayout у меня только фрагменты с картинками.
Тогда можно просто вызвать
Java
1
imageLayout.removeAllViews();
перед добавлением новых фрагментов.
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,733
06.11.2014, 17:36 11
dimchel, ещё вместо commit использую commitAllowingStateLoss для случая, когда активность разрушена, но это неправильно. Метод удаления фрагментов у вас уже написан. По-видимому, проблема и правда в картинках, а не фрагментах.
0
06.11.2014, 17:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2014, 17:36

Как получить файлы из кеша WebBrowser?
Как получить кешированные файлы или ссылки на них после загрузки страницы в...

Как получить доступ к ячейкам DBGrid после SQL-запроса ADOQuery
Здравствуйте! Я на C++ Builder-е программирую давно но с Базами данных...

Как получить доступ к ftp, http и ssh по VPN через роутер, если есть доступ к samba?
Есть системник с Ubuntu Server 12.04. Он находится за роутером. На системнике...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru