0

私はビューページャアダプタ(FragmentStatePagerAdapter)を作成し、ビューページャをこのアダプタに設定するアクティビティを持っています。アクティビティが破棄されたときのViewPagerとFragmentStatePagerAdapterの問題

これはビューポートアダプタが作成され、ビューページウィジェットに設定される方法です。

viewPageAdapter = new viewPageAdapter(getSupportFragmentManager(), getApplicationContext()); 

mCustomSwipeViewPager.setAdapter(viewPageAdapter); 

そして、これは私が今viewPageAdapter

public class viewPagerAdapter extends FragmentStatePagerAdapter { 


    private SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>(); 

    public viewPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     // returning newly created fragment 
    } 

    @Override 
    public int getCount() { 
     // returning total count 
    } 


    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Fragment fragment = (Fragment) super.instantiateItem(container, position); 
     // This is where i am putting created fragment in the sparse array, 
     // which i will be accessing in the activity based on position 
     // for updating fragment views. 
     registeredFragments.put(position, fragment); 
     return fragment; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     // And here i am removing it from the sparse array 
     registeredFragments.remove(position); 
     super.destroyItem(container, position, object); 
    } 
} 

を作成しています方法です、私は、開発者の選択肢に行って、「活動を続けるDONOT」にチェック。

これは問題が始まる場所です。このアクティビティを進めると、このアクティビティは破棄されますが、これは問題ありません。私は戻ってくる場合

は今、新しいアダプタが(のonCreateで作成された)とviewpagerに設定されているが、それは代わりに、それはで断片と、instantiateItem()を呼んだ、再びのgetItem()を呼び出していませんメモリはヌルです。私はデバッグモードでfragmentmanagerを確認

、フラグメントマネージャは、ヌルなど、すべてのフラグメントフィールドで、のActiveStateように2つの断片を保持しています。

私が試してみました物事... onDestroy(中フラグメントマネージャをクリアしようとしました

  • fragmentManager.getFragments.clearを(使用して活動の)が、運。
  • アダプターのgetItemCount()を0にし、onDestroy()のアダプターでnotifydatasetChanged()を呼び出しましたが、これは変わりません。

しかし、コメントアウトsuper.onSavedInstance()活動のをすれば、それが正常に働いているが、これは、それはいくつかのケースで失敗だと私は望んではありません。

新しいアダプタを作成してビューアに再度設定する方法はありますか?つまり、fragmentStateViewPagerAdapterのパフォーマンスを最小限に抑えずにgetItem()を最初の位置から呼び出す必要があります。

何か助けや助言をいただければ幸いです。

答えて

1

私は考え出した唯一の解決策は、アクティビティのライフサイクルのデフォルトsuper.onSaveInstanceState(outState)内部onSaveInstanceState(バンドルoutState)コールバックをコメントアウトすることです。

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    //  super.onSaveInstanceState(outState); 
} 

viewpagerfragmentManagerにフラグメント古いインスタンスを保持しません。そうして新たにスタートします。

私も活動中の断片の内側との多くのグローバル変数があるとして、任意のより良い解決策を考え、それがプレゼンターだ、とonSaveInstanceStateバンドルでそれらを保存し、それらをのonCreateまたはそれらを復元することができませんでしたonRestoreInstanceState()は私にとって非常に重いです。

これよりも優れた解決策またはアプローチは、まだ目立っています。

0

同じ問題があった場合、フラグメントのビューコンテナにプログラムでIDを割り当てていましたが、これを削除してレイアウトXMLファイルにIDを割り当てて、問題はなくなりました。

+0

oh okaie .. !!!私はそれを試してみましょう。 – Ritesh

関連する問題