Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 20 июн 2018, 06:29

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: 13 ноя 2013, 01:33 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
Поворот экрана. А что будет с фрагментом, если ему стоит флаг setRetainInstance(true)? А если false? А если мы удалим перед поворотом фрагмент? Или при старте? Или в обоих местах? replace использовать или add?
Да какая разница... Пациент быстрее жив, чем мертв.
Код фрагмента. Тут просто будем выводить в консоль его жизненный цикл
Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1. public class MyFragment extends Fragment {
  2.  
  3.     @Override
  4.     public void onAttach(Activity activity) {
  5.         super.onAttach(activity);
  6.         Log.d("sample", "Fragment onAttach "+this);
  7.     }
  8.  
  9.     public void onCreate(Bundle savedInstanceState) {
  10.         super.onCreate(savedInstanceState);
  11.         Log.d("sample", "Frag onCreate "+this);
  12.     }
  13.  
  14.     public View onCreateView(LayoutInflater inflater, ViewGroup container,
  15.                              Bundle savedInstanceState) {
  16.         View fragment = inflater.inflate(R.layout.fragment, null);
  17.         Log.d("sample", "Frag onCreateView " + this);
  18.         return fragment;
  19.     }
  20.  
  21.     public void onActivityCreated(Bundle savedInstanceState) {
  22.         super.onActivityCreated(savedInstanceState);
  23.         Log.d("sample", "Frag onActivityCreated "+this);
  24.     }
  25.  
  26.     public void onStart() {
  27.         super.onStart();
  28.         Log.d("sample", "Frag onStart "+this);
  29.     }
  30.  
  31.     public void onResume() {
  32.         super.onResume();
  33.         Log.d("sample", "Frag onResume "+this);
  34.     }
  35.  
  36.     public void onPause() {
  37.         super.onPause();
  38.         Log.d("sample", "Frag onPause "+this);
  39.     }
  40.  
  41.     public void onStop() {
  42.         super.onStop();
  43.         Log.d("sample", "Frag onStop "+this);
  44.     }
  45.  
  46.     public void onDestroyView() {
  47.         super.onDestroyView();
  48.         Log.d("sample", "Frag onDestroyView "+this);
  49.     }
  50.  
  51.     public void onDestroy() {
  52.         super.onDestroy();
  53.         Log.d("sample", "Frag onDestroy "+this);
  54.     }
  55.  
  56.     public void onDetach() {
  57.         super.onDetach();
  58.         Log.d("sample", "Frag onDetach "+this);
  59.     }
  60. }
  61.  

Допустим наше желание НЕ сохранять фрагмент при повороте. Когда такое может понадобиться. К примеру, если у вас есть ViewPager, который является фрагментом, а в нем еще несколько фрагментов. А теперь добавьте сюда логики, к примеру, в ландшафте располагать 2 фрагмента, а в портрете один. Тут сохранение идет лесом. Закончим лирическое отступление.
Код активности. Будем его по мере необходимости изменять
Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1. public class MainActivity extends FragmentActivity {
  2.     @Override
  3.     protected void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setContentView(R.layout.activity_main);
  6.         Log.d("sample", "MainActivity onStart");
  7.        
  8.         MyFragment myFragment = new MyFragment();
  9.         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
  10.         transaction.add(R.id.main_frame, myFragment);
  11.         transaction.commit();
  12.     }
  13.    
  14.     protected void onStart() {
  15.         super.onStart();
  16.         Log.d("sample", "MainActivity onStart");
  17.       }
  18.  
  19.       protected void onResume() {
  20.         super.onResume();
  21.         Log.d("sample", "MainActivity onResume");
  22.       }
  23.  
  24.       protected void onPause() {
  25.         super.onPause();
  26.         Log.d("sample", "MainActivity onPause");
  27.       }
  28.  
  29.       protected void onStop() {
  30.         super.onStop();
  31.         Log.d("sample", "MainActivity onStop");
  32.       }
  33.  
  34.       protected void onDestroy() {
  35.         super.onDestroy();
  36.         Log.d("sample", "MainActivity onDestroy");
  37.       }
  38. }

Я добавил специально transaction.add, дабы показать разницу. Итак, консоль
Всегда создаем фрагмент в onCreate. Жизненный цикл до onResume.
Цитата:
MainActivity onStart
Fragment onAttach MyFragment{416a46e8 #0 id=0x7f080000}
Frag onCreate MyFragment{416a46e8 #0 id=0x7f080000}
Frag onCreateView MyFragment{416a46e8 #0 id=0x7f080000}
Frag onActivityCreated MyFragment{416a46e8 #0 id=0x7f080000}
Frag onStart MyFragment{416a46e8 #0 id=0x7f080000}
MainActivity onStart
MainActivity onResume
Frag onResume MyFragment{416a46e8 #0 id=0x7f080000}
Frag onPause MyFragment{416a46e8 #0 id=0x7f080000}
MainActivity onPause
MainActivity onResume
Frag onResume MyFragment{416a46e8 #0 id=0x7f080000}

Кстати замечу, что в фигурных скобках информация об объекте фрагмента {адрес памяти, номер фрагмента в стеке, на сколько понял, id контейнера}
Всё красиво, всё правильно. Поворачиваем экран.
Цитата:
11-13 01:57:05.944: D/sample(19366): Frag onPause MyFragment{416a46e8 #0 id=0x7f080000}
11-13 01:57:05.944: D/sample(19366): MainActivity onPause
11-13 01:57:05.944: D/sample(19366): Frag onStop MyFragment{416a46e8 #0 id=0x7f080000}
11-13 01:57:05.944: D/sample(19366): MainActivity onStop
11-13 01:57:05.944: D/sample(19366): Frag onDestroyView MyFragment{416a46e8 #0 id=0x7f080000}
11-13 01:57:05.954: D/sample(19366): Frag onDestroy MyFragment{416a46e8 #0 id=0x7f080000}
11-13 01:57:05.954: D/sample(19366): Frag onDetach MyFragment{416a46e8 #0 id=0x7f080000}
11-13 01:57:05.954: D/sample(19366): MainActivity onDestroy
11-13 01:57:06.084: D/sample(19366): Fragment onAttach MyFragment{416f9e48 #0 id=0x7f080000}
11-13 01:57:06.084: D/sample(19366): Frag onCreate MyFragment{416f9e48 #0 id=0x7f080000}
11-13 01:57:06.154: D/sample(19366): MainActivity onStart
11-13 01:57:06.154: D/sample(19366): Frag onCreateView MyFragment{416f9e48 #0 id=0x7f080000}
11-13 01:57:06.164: D/sample(19366): Frag onActivityCreated MyFragment{416f9e48 #0 id=0x7f080000}
11-13 01:57:06.164: D/sample(19366): Fragment onAttach MyFragment{41703da8 #1 id=0x7f080000}
11-13 01:57:06.164: D/sample(19366): Frag onCreate MyFragment{41703da8 #1 id=0x7f080000}
11-13 01:57:06.174: D/sample(19366): Frag onCreateView MyFragment{41703da8 #1 id=0x7f080000}
11-13 01:57:06.174: D/sample(19366): Frag onActivityCreated MyFragment{41703da8 #1 id=0x7f080000}
11-13 01:57:06.174: D/sample(19366): Frag onStart MyFragment{416f9e48 #0 id=0x7f080000}
11-13 01:57:06.174: D/sample(19366): Frag onStart MyFragment{41703da8 #1 id=0x7f080000}
11-13 01:57:06.174: D/sample(19366): MainActivity onStart
11-13 01:57:06.194: D/sample(19366): MainActivity onResume
11-13 01:57:06.194: D/sample(19366): Frag onResume MyFragment{416f9e48 #0 id=0x7f080000}
11-13 01:57:06.194: D/sample(19366): Frag onResume MyFragment{41703da8 #1 id=0x7f080000}

Особо интересное я выделил жирным. До onCreate вылез наш фрагмент. А дальше вы можете лицезреть ДВА фрагмента с одной РАЗНЫМИ областями памяти, 416f9e48 и 41703da8.
Ну хорошо, давайте теперь поставим replace вместо add.
Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1.     protected void onCreate(Bundle savedInstanceState) {
  2.         super.onCreate(savedInstanceState);
  3.         setContentView(R.layout.activity_main);
  4.         Log.d("sample", "MainActivity onStart");
  5.        
  6.         MyFragment myFragment = new MyFragment();
  7.         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
  8.         transaction.replace(R.id.main_frame, myFragment);
  9.         transaction.commit();
  10. }
  11.  

При старте всё нормально. Буду показывать только при повороте
Цитата:
11-13 02:02:19.694: D/sample(20012): Frag onPause MyFragment{416a4dd8 #0 id=0x7f080000}
11-13 02:02:19.694: D/sample(20012): MainActivity onPause
11-13 02:02:19.704: D/sample(20012): Frag onStop MyFragment{416a4dd8 #0 id=0x7f080000}
11-13 02:02:19.704: D/sample(20012): MainActivity onStop
11-13 02:02:19.704: D/sample(20012): Frag onDestroyView MyFragment{416a4dd8 #0 id=0x7f080000}
11-13 02:02:19.704: D/sample(20012): Frag onDestroy MyFragment{416a4dd8 #0 id=0x7f080000}
11-13 02:02:19.704: D/sample(20012): Frag onDetach MyFragment{416a4dd8 #0 id=0x7f080000}
11-13 02:02:19.704: D/sample(20012): MainActivity onDestroy
11-13 02:02:19.774: D/sample(20012): Fragment onAttach MyFragment{416b7530 #0 id=0x7f080000}
11-13 02:02:19.784: D/sample(20012): Frag onCreate MyFragment{416b7530 #0 id=0x7f080000}
11-13 02:02:19.844: D/sample(20012): MainActivity onStart
11-13 02:02:19.854: D/sample(20012): Frag onCreateView MyFragment{416b7530 #0 id=0x7f080000}
11-13 02:02:19.854: D/sample(20012): Frag onActivityCreated MyFragment{416b7530 #0 id=0x7f080000}
11-13 02:02:19.854: D/sample(20012): Frag onDestroyView MyFragment{416b7530 #0 id=0x7f080000}
11-13 02:02:19.864: D/sample(20012): Frag onDestroy MyFragment{416b7530 #0 id=0x7f080000}
11-13 02:02:19.864: D/sample(20012): Frag onDetach MyFragment{416b7530 #0 id=0x7f080000}
11-13 02:02:19.864: D/sample(20012): Fragment onAttach MyFragment{416c1490 #0 id=0x7f080000}
11-13 02:02:19.864: D/sample(20012): Frag onCreate MyFragment{416c1490 #0 id=0x7f080000}
11-13 02:02:19.864: D/sample(20012): Frag onCreateView MyFragment{416c1490 #0 id=0x7f080000}
11-13 02:02:19.874: D/sample(20012): Frag onActivityCreated MyFragment{416c1490 #0 id=0x7f080000}
11-13 02:02:19.874: D/sample(20012): Frag onStart MyFragment{416c1490 #0 id=0x7f080000}
11-13 02:02:19.874: D/sample(20012): MainActivity onStart
11-13 02:02:19.874: D/sample(20012): MainActivity onResume
11-13 02:02:19.884: D/sample(20012): Frag onResume MyFragment{416c1490 #0 id=0x7f080000}

Жирным я выделил область памяти сохранившегося фрагмента. Посмотрите, какие он проходит жизненные циклы.
onAttach
onCreate
onCreateView
onActivityCreated
onDestroyView
onDestroy

Более того, если я создам фрагмент к примеру в жизненном цикле активности onStart или onReume, то данный фрагмент пройдет еще больше жизненных циклов.
Попробуем удалить. Добавим метод удаления фрагмента по ID контейнера в onCreate активити.
Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1. public class MainActivity extends FragmentActivity {
  2.     @Override
  3.     protected void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setContentView(R.layout.activity_main);
  6.         Log.d("sample", "MainActivity onStart");
  7.        
  8.         MyFragment myFragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.main_frame);
  9.         if (myFragment!=null) {
  10.             FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
  11.             ft.remove(myFragment);
  12.             myFragment = null;
  13.             ft.commit();
  14.             Log.d("sample", "Removed in onCreate");
  15.         }
  16.        
  17.         myFragment = new MyFragment();
  18.         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
  19.         transaction.replace(R.id.main_frame, myFragment);
  20.         transaction.commit();
  21.     }
  22.    
  23.     protected void onStart() {
  24.         super.onStart();
  25.         Log.d("sample", "MainActivity onStart");
  26.       }
  27.  
  28.       protected void onResume() {
  29.         super.onResume();
  30.         Log.d("sample", "MainActivity onResume");
  31.       }
  32.  
  33.       protected void onPause() {
  34.         super.onPause();
  35.         Log.d("sample", "MainActivity onPause");
  36.       }
  37.  
  38.       protected void onStop() {
  39.         super.onStop();
  40.         Log.d("sample", "MainActivity onStop");
  41.       }
  42.  
  43.       @Override
  44.       protected void onDestroy() {
  45.         super.onDestroy();
  46.       }
  47. }
  48.  

Получим
Цитата:
11-13 02:11:26.684: D/sample(20780): Frag onPause MyFragment{416a1df0 #0 id=0x7f080000}
11-13 02:11:26.684: D/sample(20780): MainActivity onPause
11-13 02:11:26.694: D/sample(20780): Frag onStop MyFragment{416a1df0 #0 id=0x7f080000}
11-13 02:11:26.694: D/sample(20780): MainActivity onStop
11-13 02:11:26.694: D/sample(20780): Frag onDestroyView MyFragment{416a1df0 #0 id=0x7f080000}
11-13 02:11:26.694: D/sample(20780): Frag onDestroy MyFragment{416a1df0 #0 id=0x7f080000}
11-13 02:11:26.694: D/sample(20780): Frag onDetach MyFragment{416a1df0 #0 id=0x7f080000}
11-13 02:11:26.744: D/sample(20780): Fragment onAttach MyFragment{416b5538 #0 id=0x7f080000}
11-13 02:11:26.744: D/sample(20780): Frag onCreate MyFragment{416b5538 #0 id=0x7f080000}
11-13 02:11:26.784: D/sample(20780): MainActivity onStart
11-13 02:11:26.784: D/sample(20780): Removed in onCreate
11-13 02:11:26.794: D/sample(20780): Frag onCreateView MyFragment{416b5538 #0 id=0x7f080000}
11-13 02:11:26.794: D/sample(20780): Frag onActivityCreated MyFragment{416b5538 #0 id=0x7f080000}
11-13 02:11:26.794: D/sample(20780): Frag onDestroyView MyFragment{416b5538 #0 id=0x7f080000}
11-13 02:11:26.794: D/sample(20780): Frag onDestroy MyFragment{416b5538 #0 id=0x7f080000}
11-13 02:11:26.794: D/sample(20780): Frag onDetach MyFragment{416b5538 #0 id=0x7f080000}
11-13 02:11:26.794: D/sample(20780): Fragment onAttach MyFragment{416bf5e0 #0 id=0x7f080000}
11-13 02:11:26.794: D/sample(20780): Frag onCreate MyFragment{416bf5e0 #0 id=0x7f080000}
11-13 02:11:26.794: D/sample(20780): Frag onCreateView MyFragment{416bf5e0 #0 id=0x7f080000}
11-13 02:11:26.794: D/sample(20780): Frag onActivityCreated MyFragment{416bf5e0 #0 id=0x7f080000}
11-13 02:11:26.794: D/sample(20780): Frag onStart MyFragment{416bf5e0 #0 id=0x7f080000}
11-13 02:11:26.794: D/sample(20780): MainActivity onStart
11-13 02:11:26.804: D/sample(20780): MainActivity onResume
11-13 02:11:26.804: D/sample(20780): Frag onResume MyFragment{416bf5e0 #0 id=0x7f080000}

И получаем, что фрагмент не может удалиться. Он прошел свои жизненные циклы, умер и после создан был новый. Замечу, замечу, что до поворота и после поворота, все экземпляры (до поворота один и после поворота два) - разные объекты. Так что не думайте, что область памяти у этого глючного фрагмента, что появляется после поворота, будет того, что до поворота.
Решить проблему я смог, очень стандартно, но не так, как хотелось бы
Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1.         @Override
  2.     protected void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.         setContentView(R.layout.activity_main);
  5.        
  6.         myFragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.main_frame);
  7.         if (myFragment==null) {
  8.             myFragment = new MyFragment();
  9.         }
  10.         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
  11.         transaction.replace(R.id.main_frame, myFragment);
  12.         transaction.commit();
  13.     }
  14.  

Т.е. ищите фрагмент всегда, даже если вы ничего не сохраняете.
Цитата:
11-13 02:21:26.044: D/sample(21645): Frag onPause MyFragment{416a7c78 #0 id=0x7f080000}
11-13 02:21:26.044: D/sample(21645): MainActivity onPause
11-13 02:21:26.044: D/sample(21645): Frag onStop MyFragment{416a7c78 #0 id=0x7f080000}
11-13 02:21:26.044: D/sample(21645): MainActivity onStop
11-13 02:21:26.064: D/sample(21645): Frag onDestroyView MyFragment{416a7c78 #0 id=0x7f080000}
11-13 02:21:26.064: D/sample(21645): Frag onDestroy MyFragment{416a7c78 #0 id=0x7f080000}
11-13 02:21:26.064: D/sample(21645): Frag onDetach MyFragment{416a7c78 #0 id=0x7f080000}
11-13 02:21:26.154: D/sample(21645): Fragment onAttach MyFragment{416b8e98 #0 id=0x7f080000}
11-13 02:21:26.154: D/sample(21645): Frag onCreate MyFragment{416b8e98 #0 id=0x7f080000}
11-13 02:21:26.194: D/sample(21645): Frag onCreateView MyFragment{416b8e98 #0 id=0x7f080000}
11-13 02:21:26.194: D/sample(21645): Frag onActivityCreated MyFragment{416b8e98 #0 id=0x7f080000}
11-13 02:21:26.204: D/sample(21645): Frag onStart MyFragment{416b8e98 #0 id=0x7f080000}
11-13 02:21:26.204: D/sample(21645): MainActivity onStart
11-13 02:21:26.204: D/sample(21645): MainActivity onResume
11-13 02:21:26.204: D/sample(21645): Frag onResume MyFragment{416b8e98 #0 id=0x7f080000}

Если вкратце, то при повороте экрана, фрагменты всегда сохраняются, так что вы можете даже с transaction.replace получить memory leak. Речь идёт про динамически добавленные фрагменты. Статические итак не удаляются
Материалы по теме:
Вырезка с книги Professional Android 4 Application Development (Wrox Professional Guides)
Цитата:
"to ensure a consistent user experience, Android persists the Fragment layout and associated back stack when an Activity is restarted due to a configuration change." (p. 124)

Dynamically added fragments are not removed when the container is removed
Android Fragment lifecycle over orientation changes
Fragment/Activity Lifecycles and Orientation Change
Weird fragment lifecycle error

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 авг 2014, 01:34 

Зарегистрирован: 30 мар 2013, 22:52
Сообщений: 223
Благодарил (а): 14 раз.
Поблагодарили: 11 раз.
Провозился более суток с удалением фрагментов...

Задача была такова:

Есть 3 фрагмента main, в каждом есть ViewPager с фрагментами...
При смене main фрагмента (по боковому меню) методом replace, количество фрагментов росло... Т.е. те фрагменты что создавались адаптером для ViewPager'a не удалялись из памяти и плодились до безобразия...

Решение же оказалось для меня внезапно удивляющим...

Вместо
Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1. pagerAdapter = new MyFragmentPagerAdapter(geFragmentManager());

написал так:
Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1. pagerAdapter = new MyFragmentPagerAdapter(getChildFragmentManager());


Теперь фрагменты не плодятся...

_________________
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 авг 2014, 08:15 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
Вообще для меня вопрос, как программа вообще работала. У меня она падала, когда я не использовал getChildFragmentManager во вложенных фрагментах.
Чтобы находить утечки, советую всё же поучить немного инструмент MAT (Memory Analizer Tool). Я так о нем и не выпустил статью, хотя он и только он мне помог выявить утечки памяти в моей программе. Ту статью, что я написал на хабре, она больше к оптимизации кода и к пониманию, что работает медленно.

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 авг 2014, 08:42 
Аватар пользователя

Зарегистрирован: 13 ноя 2013, 14:46
Сообщений: 1956
Благодарил (а): 10 раз.
Поблагодарили: 275 раз.
Mikhail_dev писал(а):
Я так о нем и не выпустил статью

Ну вот нашли причину всех бед... :)

_________________
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 авг 2014, 09:43 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
Честно говоря, я не понял что ты сказал.
Я в своей статье на хабре обещал рассмотреть в дальнейшем MAT и написать статью по нему. Об этом и сказал.

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 авг 2014, 11:51 

Зарегистрирован: 30 мар 2013, 22:52
Сообщений: 223
Благодарил (а): 14 раз.
Поблагодарили: 11 раз.
Mikhail_dev писал(а):
Вообще для меня вопрос, как программа вообще работала. У меня она падала, когда я не использовал getChildFragmentManager во вложенных фрагментах.


Работала на 2.х и 4.х, на двух реальных и 3 виртуальных устройствах... Также у тестеров все работало, и кстати работает у более чем 10 тысяч пльзователей в релиз версии...
Цитата:
Чтобы находить утечки, советую всё же поучить немного инструмент MAT (Memory Analizer Tool). Я так о нем и не выпустил статью, хотя он и только он мне помог выявить утечки памяти в моей программе. Ту статью, что я написал на хабре, она больше к оптимизации кода и к пониманию, что работает медленно.


А ведь обещал написать ))) Спасибо, посмотрю что это такое...

_________________
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 авг 2014, 11:53 

Зарегистрирован: 30 мар 2013, 22:52
Сообщений: 223
Благодарил (а): 14 раз.
Поблагодарили: 11 раз.
Кстати, пока возился с удалением фрагментов, пробовал что-то такое: getFragmentManager().getFragments().remove(1) - или .clear(); Так и не понял - сам фрагмент удаляется из памяти, или только из списка фрагментов? )))

_________________
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 авг 2014, 12:07 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
Он как бы кешируется, чтобы можно было потом его показать. В принципе это вполне нормально. Считай это пулом фрагментов. Они как бы полумертвые, пустые, но созданные.

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 01 апр 2017, 22:58 

Зарегистрирован: 02 янв 2014, 06:43
Сообщений: 11
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Извините за апание старой темы.
Проблема следующая - фрагменты экстендится от abstract class AbstractTabFragment
Код: [ Загрузить ] [ Скрыть ]
  1. public abstract class AbstractTabFragment extends Fragment { 
  2.     private String title; 
  3.     protected Context context; 
  4.     protected View view; 
  5.  
  6.     public String getTitle() { 
  7.         return title; 
  8.     } 
  9.  
  10.     public void setTitle(String title) { 
  11.         this.title = title; 
  12.     } 

который содержит поле protected Context context. Именно при повороте устройства значение этого поля становится null.

Класс адаптер для табов
Код: [ Загрузить ] [ Скрыть ]
  1. import android.content.Context; 
  2. import android.support.v4.app.Fragment; 
  3. import android.support.v4.app.FragmentManager; 
  4. import android.support.v4.app.FragmentPagerAdapter; 
  5. import android.view.ViewGroup; 
  6.  
  7. import java.util.HashMap; 
  8. import java.util.Map; 
  9.  
  10. import ru.rassvetmedia.totalconrolbeta.fragments.AbstractTabFragment; 
  11. import ru.rassvetmedia.totalconrolbeta.fragments.AccountsFragment; 
  12. import ru.rassvetmedia.totalconrolbeta.fragments.ReportFragment; 
  13.  
  14.  
  15. public class TabsPagerAdapter extends FragmentPagerAdapter { 
  16.     private Map<Integer, AbstractTabFragment> tabs; 
  17.     private Context context; 
  18.  
  19.     public TabsPagerAdapter(Context context, FragmentManager fm) { 
  20.         super(fm); 
  21.         this.context = context; 
  22.         initFragments(context); 
  23.  
  24.     } 
  25.  
  26.     @Override 
  27.     public CharSequence getPageTitle(int position) { 
  28.         return tabs.get(position).getTitle(); 
  29.     } 
  30.  
  31.     @Override 
  32.     public Fragment getItem(int position) { 
  33.         return tabs.get(position); 
  34.  
  35.     } 
  36.  
  37.     @Override 
  38.     public int getCount() { 
  39.         return tabs.size(); 
  40.     } 
  41.  
  42.     private void initFragments(Context context) { 
  43.         this.tabs = new HashMap<>(); 
  44.         tabs.put(0, AccountsFragment.getInstance(context)); 
  45.         tabs.put(1, ReportFragment.getInstance(context)); 
  46.     } 


Код (фрагмент кода) фрагмента, где собственно и происходит падение:
Код: [ Загрузить ] [ Скрыть ]
  1. @Nullable 
  2.     @Override 
  3.     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
  4.         db = GetSQLiteOpenHelper.getHelperInstance(this.context); 
  5.         db.getWritableDatabase(); 
  6.  
  7.         final View rootView = inflater.inflate(LAYOUT, container, false); 
  8.  
  9.         infos = new AndroidListAccountsViewModel(this.context); 
  10.         ListView lv = (ListView) rootView.findViewById(R.id.listView); 
  11.         infos.setLv(lv).setContext(this.context); 
  12.         scAdapter = new SimpleCursorAdapter(this.context, R.layout.list_item, null, from, to, 0); 
  13.         lv.setAdapter(scAdapter); 
  14.  
  15.         fab = (FloatingActionButton) rootView.findViewById(R.id.fab); 
  16.         fab.setOnClickListener(new View.OnClickListener() { 
  17.             public void onClick(View rootView) { 
  18.                 Log.d(Constans.LOG_TAG, "FloatingActionButton onClick"); 
  19.                 openDialogFirstSettingsApp(); 
  20.             } 
  21.         }); 
  22.  
  23.         getLoaderManager().initLoader(0, null, this); 
  24.         return rootView; 
  25.     } 

Почему?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB