2017-08-17 7 views
-1

アクティビティに2つのフラグメントがあります。いくつかのプロセスを実行した後、私は以下のコードを使用してフラグメントをクローズしています。java.lang.IllegalStateException:キーf0のフラグメントが存在しません:インデックス1

if (getActivity().getSupportFragmentManager().getBackStackEntryCount() > 0) { 
         getActivity().getSupportFragmentManager().popBackStackImmediate(); 
} 

しかし、ライン上のpopBackStackImmediate()そのフラグメントを閉じ、他のクラッシュがありません

Process: com.TestProject.testpro, PID: 17966 
java.lang.IllegalStateException: Fragment no longer exists for key f0: index 1 
    at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:879) 
    at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:215) 
    at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1481) 
    at android.view.View.dispatchRestoreInstanceState(View.java:14746) 
    at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3121) 
    at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3127) 
    at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3127) 
    at android.view.View.restoreHierarchyState(View.java:14724) 
    at android.support.v4.app.Fragment.restoreViewState(Fragment.java:475) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1329) 
    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) 
    at android.support.v4.app.BackStackRecord.executePopOps(BackStackRecord.java:807) 
    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2360) 
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149) 
    at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103) 
    at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:823) 
    at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:776) 
    at com.TestProject.testpro.application.fragments.WFMUpgradeToAffinityFragmentAN$WFMStoreProfileIdReceiver.onReceive(WFMUpgradeToAffinityFragmentAN.java:1064) 
    at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297) 
    at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46) 
    at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

エラーを投げます。私はこの問題の正確な解決策を見つけることができません。これで私を助けてください。

編集:

私は以下の関数を使用してフラグメントを呼び出しています。

void showContentFragment(Fragment newFragment, String backStackName) { 
    //Log.e(TAG, "showContentFragment- " + "BackstackName: "+ backStackName); 
    FragmentManager mFragmentManager = getActivity().getSupportFragmentManager(); 
    if (newFragment != null) { 
     //updateNavigation(backStackName); 
     FragmentTransaction ft = mFragmentManager.beginTransaction(); 
     ft.replace(R.id.fragment_container, newFragment); 
     if (backStackName != null && !backStackName.isEmpty()) { 
      ft.addToBackStack(backStackName); 
     } 

     ft.commit(); 
    } 
} 
+0

は、あなただけの 'popBackStack()'使用してみましたか? – Kiya

+0

@Kiyaはい、私は試しました。まだ運がありません。 – Sniper

+0

バックスタックにフラグメントを追加していますか?あなたのコードを投稿して、あなたのフラグメントをアクティビティに追加してください。 – AndiM

答えて

0

if (getFragmentManager().getBackStackEntryCount() > 0) { 
         getFragmentManager().popBackStack(); 
} 

はあなたが右の断片クラス

をインポートしていることを確認してくださいあなたのフラグメントから popBackStack()を呼び出すため、このコードを使用して、アクティビティ

getSupportFragmentManager().beginTransaction() 
       .replace(R.id.frame, yourFragment, yourFragment.class.getSimpleName()).addToBackStack(yourFragment.class.getSimpleName()) 
       .commit(); 

からの断片を追加するには、この手順に従ってください

import android.support.v4.app.Fragment; 
+0

私は上記と同じ手順に従っています。まだ問題に直面しています。 – Sniper

0

以下のコードをフラグメントクラスに追加します。docに従って、フラグメントが閉じる準備をしているときにシーンからビューを移動するための遷移を返します。

@Override 
    public Object getReturnTransition() { 
     return super.getReturnTransition(); 
    } 
+0

これも追加しました。まだクラッシュしている。 – Sniper

+0

クラッシュ時に同じエラーが発生しましたか? –

+0

はい。同じクラッシュ。 – Sniper

0

あなたのスタックトレースを使用すると、両方のViewPagerを使用してbackstackを自分で操作している示しています。

これはおそらく良い考えではありません。あなたのViewPagerがバックスタックを管理するか(それはうまくいく)、それともあなた自身で管理してください。

バックスタックの管理では、インスタンスの状態(スタックトレース内の機能)とFragment lifecycleを復元する必要があることに注意してください。

これは、メモリが少ない状態では、アクティビティとフラグメントが停止することを意味します。インスタンスの状態を正しく保存していない場合は、再起動すると上記のようなエラーが発生します。フラグメントのワークフローが単純な場合は、ViewPagerを使用してこれらのすべてを回避できます。

0
public void showContentFragment(Fragment fragment, Bundle bundle, boolean addToBackStack) { 
     if (bundle != null) 
      fragment.setArguments(bundle); 

     tag = fragment.getClass().getSimpleName(); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right); 
     ft.replace(R.id.container_internal, fragment, tag); 
     fragment.setRetainInstance(true); // IMPORTANT 

     if (addToBackStack) 
      ft.addToBackStack(tag); 

     try { 
      ft.commit(); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
      ft.commitAllowingStateLoss(); 
     } 
0

まず、getActivity().getSupportFragmentManager()に電話する必要はありません。 getFragmentManager()FragmentManagerを呼び出すのに十分です。

あなたはサポートフラグメント getFragmentManagerにある場合は()あなたにsupportFragmentManager()を与えるか、それはあなたapp.Fragmentマネージャーなります。

ViewPager内でPopBackstackを呼び出すと、動作しません。別の断片の中にviewPagerを使用している場合。親フラグメントでのみpopBackstackを呼び出す必要があります。 viewPagerにはありません。

以下のコードを試してください。バックスタック名に従ってスタックをクリアします。

getFragmentManager.popBackStackImmediate(YourBackStackName, FragmentManager.POP_BACK_STACK_INCLUSIVE) 

ドキュメント:https://developer.android.com/reference/android/app/FragmentManager.html#popBackStackImmediate(java.lang.String、int型)

はそれが役に立てば幸い:)

関連する問題