0

編集を回転させた後viewpagerでフラグメントを保持: アプリケーションは3を保持しているViewPagerを持つ単一の活動で構成されています:私はので、ここでこれらのことを説明する時にひどいよビデオ http://sendvid.com/mefqxd8f

コンテキストですタブ。 Tab1は、PageFragmentListenerというインターフェースを使用して、ボタンが押されたときに同じタブ内の2つの異なるフラグメント間を切り替える。アプリが最初に読み込まれると、Fragment1はTab1で膨張されます。ボタンをクリックすると、Fragment2がTab1で膨張します。私はこの後にFragment1を永久にTab1に残したいと思います。

問題: Tab3が現在アクティブ(ユーザーに表示されている)で、デバイスが回転している場合、Tab1は完全に破棄されます。再作成すると、断片2を復元する代わりに、断片1でTab1を膨張させます。ビデオでは、Tab1が紫色ではなく青色であることがわかります。

質問:Fragment1を拡張するのではなく、破損したFragment2をTab1に復元する方法はありますか?私はsavedInstanceState何とか使用できると仮定しています。回転がスタックにフラグメントを追加するために

setRetainInstance(true); 

を呼び出すことにより、以前のフラグメントを取得するには、この

transaction.addToBackStack(fragment.getClass.getName()); 

ようにしようとしている間のフラグメントの状態を保持する

class MyAdapter extends FragmentStatePagerAdapter { 
    static final String TAG = "MyAdapter"; 
    private final FragmentManager mFragmentManager; 
    public BaseFragment mFragmentA; 
    public BaseFragment mFragmentB; 

    /** 
    * PageFragmentListener for switching fragmentA. 
    */ 
    public PageFragmentListener mListenerA = new PageFragmentListener() { 
     @Override 
     public void onSwitchToNextFragment(final String id) { 
      mFragmentManager.beginTransaction().remove(mFragmentA).commit(); 
      if (mFragmentA instanceof FragmentA) 
      { 
       mFragmentA = FragmentA2.newInstance(mListenerA); // => switch fragment a2 
      } 
      else if (mFragmentA instanceof FragmentA2){ 
       mFragmentA = FragmentA.newInstance(mListenerA); 
      } 
      notifyDataSetChanged();  // notify changes 
     } 
    }; 

    /** 
    * PageFragmentListener for switching fragmentB. 
    */ 
    public PageFragmentListener mListenerB = new PageFragmentListener() { 
     @Override 
     public void onSwitchToNextFragment(final String id) { 
      mFragmentManager.beginTransaction().remove(mFragmentB).commit(); 
      if (mFragmentB instanceof ItemListFragment){  // current fragment is List Fragment 
       Bundle arguments = new Bundle(); 
       arguments.putString(Constants.ARG_ITEM_ID, id);  // selected item id 
       mFragmentB = ItemOneDetailFragment.newInstance(mListenerB);  // switch detail fragment 
       mFragmentB.setArguments(arguments); 

      }else if (mFragmentB instanceof ItemOneDetailFragment) {  // DetailFragment 
       mFragmentB = ItemListFragment.newInstance(mListenerB); // => switch list fragment 
      } 
      notifyDataSetChanged();  // notify changes 
     } 
    }; 

    public MyAdapter(FragmentManager fm) { 
     super(fm); 
     Log.d(TAG, "MyAdapterConstructor"); 
     mFragmentManager = fm; 
     List<Fragment> fragments = fm.getFragments(); 
     if(fragments != null){ 
      for(Fragment f : fragments){ 
       if (f instanceof FragmentA || f instanceof FragmentA2){ 
        mFragmentA = (BaseFragment) f; 
       } 
       if(f instanceof ItemListFragment || f instanceof ItemOneDetailFragment){ 
        mFragmentB = (BaseFragment) f; 
       } 
      } 
     } 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Log.d(TAG, "getItem()"); 

     if (position == 0){  // Tab-1 
      if (!(mFragmentA instanceof FragmentA2)) { 
       mFragmentA = FragmentA.newInstance(mListenerA); 
      } 
      return mFragmentA; 
     } 

     if (position == 1)  // Tab-2 
      return FragmentB.newInstance(); 

     if (position == 2) { // Tab-3 
      if (!(mFragmentB instanceof ItemOneDetailFragment)){ 
       mFragmentB = ItemListFragment.newInstance(mListenerB); 
      } 
      return mFragmentB; 
     } 
     else{ 
      return null; 
     } 
    } 

    /** 
    * To set tab title. 
    * @param position the currently visible ViewPager fragment 
    * @return the title of the fragment 
    */ 
    @Override 
    public CharSequence getPageTitle(int position) { 
     Log.d(TAG, "getPageTitle()"); 
     if (position == 0) { // Tab-1 
      return "Tab 1"; 
     } 
     if (position == 1) { // Tab-2 
      return "Tab 2"; 
     } 
     if (position == 2) {  //Tab-3 
      return "Tab 3"; 
     } 
     return null; 
    } 

    @Override 
    public int getCount() {  // Count of Tabs 
     return 3; 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     Log.i("Adapter", "ItemPosition>>>" + object.toString()); 
     if (object instanceof ItemListFragment && mFragmentB instanceof ItemOneDetailFragment) {  // fragment changed 
      return POSITION_NONE; 
     } 

     if (object instanceof ItemOneDetailFragment && mFragmentB instanceof ItemListFragment) {  // fragment changed 
      return POSITION_NONE; 
     } 

     if (object instanceof FragmentA && mFragmentA instanceof FragmentA2) { 
      return POSITION_NONE; 
     } 

     if (object instanceof FragmentA2 && mFragmentA instanceof FragmentA){ 
      return POSITION_NONE; 
     } 

     return POSITION_UNCHANGED; 
    } 
} 
+0

タブとフラグメントの説明がかなり混乱していますが、より明確になりますか? – sandesh

+0

申し訳ありません。 http://sendvid.com/mefqxd8fのビデオをご覧ください。私は回転後に紫色の背景を持つフラグメントを残しておきたいが、代わりに青い背景のフラグメントがロードされる。 –

答えて

0

シンプルなソリューション( onBackPressed()の呼び出し中にオンになる可能性があります)これを試してください

getFragmentManager.popBackStack(); 
+0

このコードはどこに置く必要がありますか? –

+0

フラグメントクラス内でonCreate()メソッドをオーバーライドし、そのメソッド呼び出しでsetRetainInstance(true) –

+0

この問題は解決しません。このアプリのビデオを見てください。タブ1が紫色ではなく膨張したときに、画面が青色であることに注意してください。 http://sendvid.com/mefqxd8f –

0

私の(悪い)解決策は、hasSavedInstanceと呼ばれるMainActivityのStatic Class Booleanを作成することでした。これが動作しているようです

@Override 
    public Fragment getItem(int position) { 
    Log.d(TAG, "getItem()"); 
    if (position == 0){  // Tab-1 
     Log.d(TAG, "hasSavedInstance="+MainActivity.hasSavedInstance); 
     if (mFragmentA == null && MainActivity.hasSavedInstance){ 
      mFragmentA = FragmentA2.newInstance(mListenerA); 
     } 
     else if (!(mFragmentA instanceof FragmentA2)) { 
      mFragmentA = FragmentA.newInstance(mListenerA); 
     } 
     return mFragmentA; 
    } 

が、私はのように感じる:私はその後、フラグメントがMyAdapterに戻るにするかを決定するために、この値を使用し

if (savedInstanceState == null){ 
     Log.d(TAG, "onCreate() FIRST"); 
    } 
    else{ 
     Log.d(TAG, "onCreate() ADDITIONAL"); 
     hasSavedInstance = true; 
    } 

次のように私はMainActivityの)(のonCreateにこれをtrueに設定しますこのフラグを設定することは、この問題を回避するうえで非常に控えめな方法です。