2

Android互換パッケージフラグメントに関して次の問題があります。フラグメントには次の階層があります。

A(ログイン)-> B(ダッシュボード)-> C(詳細)

ログインフラグメントは次の機能で追加されます:

private void addFragment(Fragment f) {
    FragmentTransaction ft = mFragmentManager.beginTransaction();
    ft.replace(R.id.main_content, f);
    ft.commit();
}

成功した後、バックスタックにトランザクションを追加せずに、同じ方法でログインダッシュボードを追加します。Cフラグメントは次のように追加されます。

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.main_content, f, id);
ft.addToBackStack(null);
ft.commit();

つまり、基本的に詳細画面にはログアウトボタンがあり、ログインAに移動して、バックスタックからすべてのフラグメントを削除する必要があります。アンドロイド開発者のドキュメントによると:

一方、フラグメントを削除するときにaddToBackStack()を呼び出すと、フラグメントは停止し、ユーザーが戻ったときに再開されます。

しかし、私の場合は問題ではありません。Cフラグメントでログアウトが押された場合:

getFragmentManager.popBackStackImmediate(); 
FragmentTransaction ft = mFragmentManager.beginTransaction();
ft.replace(R.id.main_content, new LoginFragment());
ft.commit();

onActivityCreated()、BフラグメントのonStart()も呼び出され(ドキュメントに記述されているonResumeの代わりに)、このフラグメントでスレッド操作を開始し、ログインフラグメントを追加した後、フラグメントBがアタッチされていないというIllegalStateExceptionが発生したため、コードがクラッシュしますアクティビティへ(スレッド操作が終了すると、フラグメントUIが更新されます)replaceが実際にどのように機能し、この問題をどのように克服するかを知っている人はいますか?

4

1 に答える 1

0

追加するフラグメントごとに addToBackStack を呼び出して、別の名前を付ける必要があると思います。あなたのコードを読むことは、あなたがそれをしていないように思えます。

于 2013-04-08T11:19:46.380 に答える