ActivityでのViewpagerでのFragmentのライフサイクルについて
4659 ワード
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_container, mFragment, SHARE_PUBLIC_LIST_FRAGMENT_TAG)
.commitAllowingStateLoss();
onResumeとonPauseの は のとおりです. Activity - onResume Fragment - onResume Activity - onPause Fragment - onPause
-ページ
ActivityとFragment ページ では、 が しないことを する があります. onPageStartにはonPageEndペアがあります. えば、onPageStart->onPageEnd->onPageStart->onPageEnd->onPageStart->onPageStart->onPageEnd では、 ページの が しいことを できます.
ViewpagerでのFragmentのライフサイクル
ViewPagerマウントFragment にFragmentPagerAdapterまたはFragmentStatePagerAdapterが され、 にFragmentManagerによってadapterのgetItemメソッドでpositionに って されるfragment が する. Viewpagerのキャッシュの により、Viewpagerが すると、 のFragmentページとキャッシュされるページが に され、 のライフサイクルがonResumeに かいます. Viewpager Activity-onResume Fragment1 - onResume Fragment2 - onResume Fragment3 - onResume
このいくつかのページのライフサイクルが に されたため、「 」が の の に され、 えたページを できないという の に を ぼした.
ソリューション
1:Viewpagerのキャッシュメカニズムを し、 のページ のページデータをキャッシュしないで、 ただけで られ、 れただけで される. このスキームは に する が きく、ユーザー に を える. 2:Fragmentを ロードする.onHiddenChanged(boolean hidden)メソッドで、そのパラメータhiddenは のfragmentの な が した 、 の であるかどうかを し、このパラメータをcheckすることによって することができる. このスキームは、 のシステム び し が な に するが、 の にこの は び されないことに される. 3:Fragmentを ロードする.setUserVisibleHint(boolean isVisibleToUser)メソッドは、そのパラメータisVisibleToUserが の り たちのニーズに も く、ページがユーザーに「 」 されているかどうかを します. このスキームは、この の のシステム び しがFragmentのonCreate よりも いため、 の び し にisVisibleToUser がfalseであり、ライフサイクル の に を える. Fragment 1-isVisibleToUser-false( ) Fragment1 - isVisibleToUser - true Fragment1 - isVisibleToUser - false Fragment 2-isVisibleToUser-false( ) Fragment2 - isVisibleToUser - true Fragment2 - isVisibleToUser - false
なソリューション
の に する とユーザー の に づいて、 3の の で することを する. setuUserVisibleHint()メソッド は たちのニーズに いので、その は が な を しました:
protected boolean isCreated = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
isCreated = true;
}
/**
* ViewPager Fragment
* For
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (!isCreated) {
return;
}
if (isVisibleToUser) {
umengPageStart();
}else {
umengPageEnd();
}
}
onCreateメソッドの に するタグで を できます. :このタグの はFragmentのonActivtyCreateメソッドに かないでください.このメソッド び しはsetuserVisibleHintの に れています.
One more thing
ViewpagerがFragmentをマウントするときにもう1つのピットがあります.Viewpagerの コンテナ(ActivityまたはFragment)は、ActivityのonResumeおよびonPause び しのように、 な が した 、Viewpager のFragmentにアプリケーションを するライフサイクルを に することはありません.したがって、 び しを2 する があります. Activityで のFragmentを せ、その メソッドを するには、Viewpagerを してPagerAdapterを き える があります. この で べたSecond Solutionを します.ViewPagerが しているFragmentを するにはどうすればいいですか.