2

Я активность с двумя атрибутами:Android ViewPager и фрагмент сериализации

  • частного фрагмента firstFragment;
  • частный фрагмент secondFragment;

В OnCreate метод:

adapter = new MyPagerAdapter(getSupportFragmentManager()); 
    pager = (ViewPager) findViewById(R.id.pager); 
    pager.setAdapter(adapter); 
    pager.setOffscreenPageLimit(6); 
    pager.setSaveEnabled(true); 

, где MyPagerAdapter расширяет класс FragmentStatePagerAdapter. Метод В GetItem():

@Override 
    public Fragment getItem(int position) { 

     Bundle args = new Bundle(); 

     switch (position) { 
      case FIRST: 
       secondFragment = new FirstFragment(); 
       secondFragment.setArguments(args); 
       return secondFragment; 
      case SECOND: 
       secondFragment = new SecondFragment(); 
       secondFragment.setArguments(args); 
       return secondFragment; 
     } 
    } 

и все работает правильно.

Но, когда я меняю ориентацию экрана, частные атрибуты имеют значение null, и я потерял ссылку на два фрагмента. Так я пытался сериализовать этот фрагмент с:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    getSupportFragmentManager().putFragment(outState, FirstFragment.class.getName(), firstFragment); 
    getSupportFragmentManager().putFragment(outState, SecondFragment.class.getName(), secondFragment); 
} 

и загрузить их в OnCreate метод с:

if (savedInstanceState != null) { 
     firstFragment = (FirstFragment) getSupportFragmentManager().getFragment(savedInstanceState, FirstFragment.class.getName()); 
     secondFragment = (SecondFragment) getSupportFragmentManager().getFragment(savedInstanceState, SecondFragment.class.getName()); 
    } 

Мои вопросы:

1. Является ли это правильный способ сериализованный фрагмент в изменения ориентации экрана активности?

2. Иногда я имею ошибку: "немаршалинг неизвестный тип кода 55 на смещение 448", возможно, что это вызвано фрагментом сериализации»

EDIT:

I необходимо иметь фрагменты, как атрибуты активности, потому что я интерфейс слушателя в деятельности, что:

@Override 
public void executeTask(String what) { 
    secondFragment.executeTask(what); 
} 

этот метод был вызван в firstFragment так firstFragment может. выполните метод SecondFragment.

ответ

0

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

Я не думаю, что вы должны ссылаться на Fragments в Adapter от Activity. Главным образом из-за того, что довольно сложно синхронизировать жизненный цикл Activity, жизненный цикл Fragment и ViewPager жизненный цикл детей. И если возникнут какие-то ошибки, отладка может быть очень болезненной. Поверьте, я был там, сделал это ...

Кстати, есть ли причина, по которой вам нужны ссылки на Fragments в вашем Activity?

EDIT

Я не думаю, что вы должны передать информацию между Fragments таким образом. В общем случае FragmentManager обрабатывает (создает, удаляет) Fragments на своем собственном, и вы не можете быть уверены, что эти Fragments будут доступны в любое время.

Я думаю, что лучше всего было бы перенести данные в отдельную модель (запись базы данных, SharedPreference или класс singelton), а затем давая знать Adapter, что данные изменились (по в Fragments или просто уведомить Adapter для обновления данных детей путем вызова notifyDataChanged).

Пример

Fragmenta ---> слушатель (reloadData()) ---> Деятельность --->adapter.notifyDataChanged() -----> fragmentB обновляется

Таким образом, если вы хотите добавить ThirdFragment или фактически любое количество Fragments, которое будет использовать данные, вам не придется беспокоиться об обновлении данных в любом из них - просто позвольте Adapter беспокоиться об этом.

+0

Вы правы. Я редактирую свой вопрос ... – CeccoCQ

+0

Это хорошее обходное решение и, вероятно, это правильный способ решения сериализации фрагмента. Использование DataObserver для изменения загруженных данных в фрагмент и бизнес-модуль для выполнения любых других операций. – CeccoCQ

0

Если вы используете тот же макет для портретной и ландшафтной ориентации, то при изменении ориентации вы можете избежать воссоздания активности. изменить свой манифест, как ...

 <activity android:name=".activity.MainActivity" 
     android:configChanges="keyboardHidden|orientation|screenSize"> 
    </activity> 

, а затем переопределить onConfigurationChanged() в деятельности ...

@Override 
    public void onConfigurationChanged(Configuration  newConfig) 
    { 
     super.onConfigurationChanged(newConfig); 
    } 
+0

Что вы имеете в виду с одинаковым расположением? Структура компонентов? У меня есть файл макетов в layout-normal-land и т. Д. ... – CeccoCQ

+0

Используете ли вы такой же макет для портрета и пейзажа? то вы можете избежать сохранения состояния при изменении ориентации. – Libin

+0

Нет, я использую другой xml для этого представления. – CeccoCQ

Смежные вопросы