ActivityでのViewpagerでのFragmentのライフサイクルについて

4659 ワード

  • Activityのライフサイクルは古典的で最も明確で、ここでは表にしない.
  • Fragmentが登場してから広く運用されるまでにも時間がかかり、その標準ライフサイクルもActivityよりもonCreateView()のような流れしかありません.
  • ActivityとFragmentは実際の符号化で必ず結合して現れ、Activityを容器として表現し、1つまたは複数のFragmentを搭載している.
  • 複数のFragmentを搭載する場合、TabHostとViewpagerをキャリアとしてよく使用する.
  • 実際の符号化では、ActivityとFragmentの混合状況では、そのライフサイクルの交差が予想と異なる可能性があることが分かった.
  • Fragmentをロードする場合:
    
        
        
        
        
    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を するにはどうすればいいですか.