Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
dimchel
0 / 0 / 0
Регистрация: 30.10.2012
Сообщений: 10
#1

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

06.11.2014, 11:28. Просмотров 665. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как получить доступ к устаревшим фрагментам после чистки кеша (Программирование Android):

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

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

Как получить доступ к тексту SMS? - Программирование Android
Тость хочу чтоб когда выскакивает меню набора текста SMS я мог бы туда при нажатие в какую - нибуть область или ещё как, пока это не важно,...

Как получить доступ к элементу в папке по имени? - Программирование Android
Есть, допустим, следующий код Bitmap srcBitmapLocal = BitmapFactory.decodeResource(getApplicationContext().getResources(), ...

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

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

10
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
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
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
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
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
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
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,654
Завершенные тесты: 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
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,654
Завершенные тесты: 1
06.11.2014, 17:35 #10
Цитата Сообщение от dimchel Посмотреть сообщение
На imageLayout у меня только фрагменты с картинками.
Тогда можно просто вызвать
Java
1
imageLayout.removeAllViews();
перед добавлением новых фрагментов.
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
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
Привет! Вот еще темы с ответами:

После чистки перестали разгонятся кулеры, как процессора так и видеокарты - Охлаждение
На днях начал сильно гудеть кулер процессора,ну глянул,там куча пыли,я ее решил почистить. Выключив питание не отсоединяя...

Сайт выпал из выдачи после обновления кеша - SEO
Доброе время суток всем. Подскажите существует ли какой нибудь сайт где можно было бы проверить забанен ли сайт. Вижу что об этом уже...

Не удается получить доступ к файлам после переустановки ОС - Windows 7
Всем привет. Когда переустанавливал винду вспомнил про проблему с правами, и на свежей винде сделал себе учетку администратора. Все-я...

После снятия и чистки компьютера , компьютер стал работать не так как прежде - Охлаждение
Вобщем решил я почистить компьютер &quot;изнутри&quot; пылесосом,все продул осталось дело за кулером, снял кулер , продул,поставил обратно. Включаю...


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

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

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