0

Activity.onCreate() 中に Fragment を配置する Fragment コンテナー (FrameLayout) を含む Activity があります。Fragment には、多数の Fragment を含む ViewPager が含まれています。これはすべて正常に機能します。ページのコンテンツが表示され、ページをうまくスワイプできます。貢献しているページが表示されると、アクション バーにアクションが表示される可能性さえあります。

ここで、ViewPager を含む Fragment を別の Fragment に置き換えます。

FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.content, new NewFragment(), tag);
transaction.addToBackStack(null);
transaction.commit();

交換するとうまくいきます。新しいフラグメントが表示されます。ViewPager を使用して Fragment をコンテナー ビューに戻す戻るボタンを押すと、問題が発生します。通常の FragmentPagerAdapter を使用すると、次の例外が発生します。

FATAL EXCEPTION: main                                                                                  
java.lang.IllegalStateException: Recursive entry to executePendingTransactions                         
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1403)        
    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431) 
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)         
    at android.support.v4.view.ViewPager.populate(ViewPager.java:895)                                  
    at android.support.v4.view.ViewPager.populate(ViewPager.java:772)                                  
    at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:380)                                
    at com.domain.app.MyFragment.onViewCreated(MyFragment.java:39)    
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)                
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)               
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:635)                            
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1431)        
    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431) 
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)         
    at android.support.v4.view.ViewPager.populate(ViewPager.java:895)                                  
    at android.support.v4.view.ViewPager.populate(ViewPager.java:772)                                  
    at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:380)                                
    at com.domain.app.MyFragment.onViewCreated(MyFragment.java:39)    
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)                
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)               
    at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:712)               
    at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1480)         
    at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:447)      
    at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:166)                
    at android.app.Activity.onKeyUp(Activity.java:2099)

ご覧のとおり、 MyFragment.onViewCreated() は 2 回実行され、2 回目のパスで例外がスローされます。ViewPager と FragmentManager のコードをステップ実行しようとしましたが、それは難しい仕事です。

さらに、FragmentPagerAdapter を FragmentStatePagerAdapter に置き換えました。これは、実際には ViewPager を含むフラグメントを再作成しますが、ViewPager 自体は作成しません。一部のページは Pager にあるように見えますが、ページのコンテンツは表示されません。onPageSelected コールバックに関してスワイプは予測できず、ViewPager のフラグメントから提供されたアクション バーのアクションが表示されることがあります。しかし、それはすべてかなり散発的です。

どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

0

これを試して

 FragStartCalculation FragStartCalculation = new FragStartCalculation();
    FragmentTransaction ft = root.getSupportFragmentManager().beginTransaction();
    ft.addToBackStack(FragStartCalculation.class.getName());
    ft.replace(R.id.fragContainner, FragStartCalculation, FragStartCalculation.class.getName());
    ft.commit();
于 2016-12-08T10:29:13.900 に答える
0

Hackborn さんの時点では、フラグメント シーム内のフラグメントはまだサポートされていないため、問題は解決不能としてマークされます。

于 2012-09-10T21:15:20.993 に答える