私には がありActivity
、それには がありViewPager
ます。これはを使用してViewPager
ロードされます。私の各フラグメントはセクションと見なされます(アプリの機能による)。最初は一度使用してすべてのアイテムをロードしますが、Fragments
Adapter
ViewPager
viewPager.setOffscreenPageLimit(sectionList.size()); //sectionList is nothing but number of framgents
フラグメントには、フラグメントの作成中にクラスsetup
から呼び出される関数があります。Adapter
調査フラグメント
public void setup(SectionView sectionView, int pos) {
this.sectionView = sectionView;
this.pos = pos;
}
調査アダプター
@Override
public Fragment getItem(int pos) {
InvestigationFragment investigationFragment = new InvestigationFragment();
investigationFragment.setup(sectionViewHashMap.get(keys.get(pos)), pos);
fragments.add(investigationFragment);
return investigationFragment;
}
ここで、SectionView
は class によって拡張された抽象クラス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 になります。ここにシナリオがあります、
カスタムカメラの実装があり、フラグメントからカスタムカメラを開き(フラグメントまたはアクティビティを破壊せずに)、画像をキャプチャし、フラグメントに戻って
onCreateView()
時々呼び出されるため、sectionView
nullになります。デバッグすると、ライフサイクル メソッドが呼び出されません (onDestroyView()
、onDestroy()
、onDetach()
、onLowMemeory()
などonConfigurationChanged()
)。では、どのようonCreateView()
に呼び出すことができますか?Nexus 9 では、実行時のパーミッションを変更すると同じことが起こりました。
Fragment
ステータス バーを下にスクロールし、[設定] > [アプリ] > [アプリのアクセス許可] > [位置情報] > [位置情報のアクセス許可を取り消す] に移動します。パーミッションを付与するとクラッシュしませんが、セクションビュー オブジェクトを取り消すと null になります
WEIRD BEHAVIOR : 2 番目のシナリオを確認するために、デバッガーを接続して、Location
権限の取り消し中にフラグメント/アクティビティが破棄されているかどうかを確認しました。場所のアクセス許可を取り消すとすぐに、デバッガーが切断され、アプリケーションが強制終了/DEAD されました。これは、権限を取り消すたびに発生します。
sectionView
オブジェクトが保持されているか、破棄されていないことを確認するにはどうすればよいですか?