2016-09-05 15 views
2

フラグメントを大量に使用するアンドロイドアプリケーションを開発しています。問題が発生しており、これまで解決策を見つけることができませんでした。 フローはこれです:アプリケーションが起動され、MainActivityが最初のレスポンダーになりました。ユーザーインタラクションに応じて、いくつかのフラグメントがロードされてスタックにプッシュされます。ここ は一例であり:復元時にAndroidリロードフラグメントスタック

主な活動 - >フラグメントA - >フラグメントB - >断片C - >など。

バック履歴がそうように有効になっている: - >フラグメントB

断片C - >フラグメントA - >など。

私のアプリケーションがフォアグラウンドになっている限り、すべてが正常に動作しますが、アプリケーションがバックグラウンドになるとすべてが壊れます。

たとえば、フラグメントBの場合、ホームボタンを押してアプリケーションをバックグラウンドで実行し、それを元に戻すとMainActivityからフラグメントAを開始します。 また、ツールバーにフラグメントBのタイトルが表示され、フラグメントAにはrecyclerviewが含まれているので、背景画像のようにアイテム行間のフラグメントBの部分を見ることができます。

これは私がフラグメントをロードする方法である:

public void loadFragment(Fragment fragment, Boolean addToStack) { 

    // Load fragment 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.frame_container, fragment); 
    fragmentTransaction.addToBackStack(null); 

    // show back button 
    if (addToStack) { 

     // Code to show the back button. 
    } 
    else if (fragmentManager.getBackStackEntryCount() > 0 && !addToStack) { 

     hideBackButton(); 

     fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } 

    fragmentTransaction.commitAllowingStateLoss(); 
} 

私はMainActivityからおよびフラグメントからこの関数を呼び出す:

MyFragment theFragment = new MyFragment(); 
MainActivity.instance.loadFragment(theFragment, true); 

私が達成したいどのようなアプリケーションが復元されたときにそれを取得ということです直前にロードされたフラグメントにまっすぐに戻って、「戻る」履歴全体を保持します。これどうやってするの?

コードの他の部分が必要な場合はわかりませんが、必要に応じて投稿します。

答えて

0

[OK]をので、多くの研究の後、私は...問題を発見し、問題は私の間違いでした。

私は、同じ問題に遭遇する可能性があるすべての人のためにここに報告したいと思います。私はそうのようなonResume()関数にフラグメントの交換を強制しようとした最初で

:アンドロイドは、少なくとも私の知る限りでは、自動的にこのすべてを処理する必要があり、そのため、私はさらに掘るしようとしたが

Fragment f = getSupportFragmentManager().findFragmentById(R.id.container); 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.replace(R.id.frame_container, f); 
fragmentTransaction.addToBackStack(null); 

と私は最終的にそれを私のonStart()メソッドに絞り込んだ。 基本的に私はEventBusを登録し、このコードは、問題を作成していたし、すべての後に、そこにそれを置くことが必要ではなかったので、私はのonCreate()メソッドに移動し、クリーンアップ関数呼び出し

if (!EventBus.getDefault().isRegistered(this)) { 

    EventBus.getDefault().register(this); 

    UserNetworkManager userNetworkManager = new UserNetworkManager(MainActivity.mainActivity); 
    userNetworkManager.fetchFeed(); 
} 

を作っていました私のコードはちょっとしたことで、今はすべてうまく動作します。

0

コールonResume()関数は:

public void onResume(){ 
    Fragment frg = null; 
    frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG"); 
    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.detach(frg); 
    ft.attach(frg); 
    ft.commit(); 
} 
+0

ご返信ありがとうございますが、私はそれを動作させることができません。私のフラグメントのonResumeでは、私はgetSupportFragmentManager()へのアクセス権がありません。私もgetFragmentManager()。findFragmentByTag( "tag_here")とgetChildFragmentManager()。findFragmentByTag( "tag_here")を試しましたが、毎回nullを返します。あなたのアプローチについてもっと教えていただけますか? – Luca

関連する問題