2

У меня есть Activity, и он имеет ViewPager. Этот ViewPager загружает Fragments используя Adapter. Мой каждый фрагмент считается Раздел (согласно функциональности приложения). Сначала я загрузить все ViewPager элементы один раз,Фрагмент не разрушен, но onCreateView называется

viewPager.setOffscreenPageLimit(sectionList.size()); //sectionList is nothing but number of framgents

В фрагменту У меня есть функция под названием setup вызывается из Adapter класса при создании фрагмента.

InvestigationFragment

public void setup(SectionView sectionView, int pos) { 
    this.sectionView = sectionView; 
    this.pos = pos; 
} 

InvestigationAdapter

@Override 
public Fragment getItem(int pos) { 
    InvestigationFragment investigationFragment = new InvestigationFragment(); 
    investigationFragment.setup(sectionViewHashMap.get(keys.get(pos)), pos); 
    fragments.add(investigationFragment); 
    return investigationFragment; 
} 

Здесь SectionView является абстрактным классом продлен класса SimpleSection. И SimpleSection добавляет пользовательские представления внутри него. Пользовательские представления похожи на классы классов 20-30.

public abstract class SectionView { 

    public Section mSection; 
    public Context mContext; 
    public LinkedHashMap<Integer, SectionView> subSectionViews; 
    public LinkedHashMap<Integer, FieldWidget> fieldWidget; 
    public int actionSaveId; 
    protected LinearLayout sectionView; 
    protected Toolbar toolbar; 

    public final void initialiseSection(Toolbar toolbar) { 
     this.toolbar = toolbar; 
     createFields(); 
     createSubSection(); 
    } 

    public final void buildSection(LinearLayout v) { 
     sectionView = v; 
     addFields(); 
     addSubSection(); 
    } 

    protected abstract void createFields(); 
    protected abstract void createSubSection(); 
    protected abstract void addFields(); 
    protected abstract void addSubSection(); 
    public abstract boolean hasSubSection(); 
    public abstract boolean validateSection(); 
    protected abstract boolean persistSection(); 

    public final boolean saveSection() { 
     boolean isSaved = true; 
      if (!validateSection()) { 
       isSaved = false; 
      } else if (!persistSection()) { 
       isSaved = false; 
      } 
     return isSaved; 
    } 
} 

Все в порядке, пока здесь. Но в некоторых сценариях SectionView имеет значение null, где я не могу его сохранить. Вот сценарий,

  1. У меня есть собственная реализация камеры, из фрагмента, я открываю свой собственный фотоаппарат (без разрушения фрагмента или активности), захват изображения, и я вернусь к фрагменту onCreateView() называют иногда, так sectionView идет null. Когда я отлаживается, ни один из методов жизненного цикла не называется (например, onDestroyView(), onDestroy(), onDetach(), onLowMemeory(),). Тогда как можно назвать onCreateView()?

  2. В Nexus 9 при изменении разрешений времени выполнения это произошло. Я буду в Fragment, Прокрутите вниз строку состояния> перейдите в Настройки> Приложения> Разрешения для приложений> Местоположение> Разрешить разрешение на размещение. Если я предоставить разрешение не будет врезаться, но если я отзывать объект sectionView будет нулевым

WEIRD ПОВЕДЕНИЕ: Для проверки 2-й сценарий, я подключен отладчик, чтобы убедиться, фрагмент/активность уничтожается или нет при аннулировании разрешения Location. Как только я отозвал разрешение на размещение, отладчик отключился и приложение было убито/DEAD. Это происходит, когда я отменяю любые разрешения.

Теперь, как я могу убедиться, что объект sectionView сохранен или не уничтожен?

ответ

0

Несколько вещей. Вы можете установить предел страницы вне экрана size() -1, потому что один из них всегда находится на экране.

Вместо того, чтобы иметь способ установки на ваших фрагментах, я предлагаю создать экземпляры ваших фрагментов со значениями, которые вы хотите.Поэтому создайте статический метод в InvestigationFragment с именем newInstance, который принимает параметры SectionView и position.

E.g.

public static InvestigationFragment newInstance(SectionView sectionView, int pos) { 
    final InvestigationFragment fragment = new InvestigationFragment(); 
    final Bundle args = new Bundle(); 
    args.putSerializable("SectionView", sectionView); //Depends on what type this as to what the put method is 
    args.putInt("Position", position); 
    fragment.setArguments(args); 
    return fragment; 
} 

Затем вы должны прочитать эти значения обратно в OnCreate из InvestigationFragment например

sectionView = (SectionView) getArguments().getSerializable("SectionView"); 

Это должно позволить вашему исследованиюFragment правильно пережить изменения вращения и т. Д.

В классе адаптера я предлагаю просто делать:

@Override 
    public Fragment getItem(final int position) { 
     return InvestigationFragment.newInstance(sectionViewHashMap.get(keys.get(position)), position); 
} 

Если вам действительно нужно сохранить список фрагментов в адаптере пейджера вы должны переопределить instantiateItem и destroyItem следующим образом:

@Override 
public Object instantiateItem(final ViewGroup container, final int position) { 
    final InvestigationFragment fragment = (InvestigationFragment) super.instantiateItem(container, position); 
    fragments.put(position, fragment); 
    return fragment; 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    fragments.remove(position); 
    super.destroyItem(container, position, object); 
} 
+0

Спасибо за ответ, позвольте мне поработать над этим и сообщить вам –

+0

Оки, я посмотрел на ваш ответ. Но у меня есть проблема, поскольку я упоминал, что «SectionView» является ** AbstractClass **. Я расширяю этот абстрактный класс во многих моих пользовательских классах просмотра. Если я создаю класс 'SectionView', реализующий интерфейс« Serializable », тогда я должен сделать все остальные классы, которые расширяются, это также должно реализовывать« Serializable »правильно? Если я этого не сделаю, тогда он бросит меня «NotSerializableException»! Например: 'Caused by: java.io.NotSerializableException: android.support.v7.widget.AppCompatEditText'. В одном из моих пользовательских представлений есть 'AppCompatEditText'. Что я должен сделать для этого? –

+0

Я только что отредактировал свой вопрос, немного кратко о части абстрактных классов. Мой абстрактный класс расширен другим классом, где он добавляет в него пользовательские представления. Поэтому я не думаю, что это поможет. Думаю, мне нужно переструктурировать. Но любые предложения или решения приветствуются, пожалуйста ... –

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