2

私の問題を説明しようとします:

私のすべてのフラグメントは setRetainInstance(true) を使用しています 私の活動 onCreate で私はこれをやっています:

    if (savedInstanceState == null) {
        fragment = onCreatePane();
        fragment.setArguments(intentToFragmentArguments(getIntent()));

        FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
        trans.add(R.id.root_container, fragment, getFragmentTag());
        trans.commit();
    } else {
        FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
        if ( fragment == null ) {

            fragment = getSupportFragmentManager().findFragmentByTag(getFragmentTag());
        }

        if (fragment == null) {
            fragment = onCreatePane();
            fragment.setArguments(intentToFragmentArguments(getIntent()));
        }           

        trans.add(R.id.root_container, fragment, getFragmentTag());
        trans.commit();

    }

したがって、アクティビティを作成し、savedInstance が null の場合、フラグメントを作成し、その引数を設定し、トランザクションを開始して、フラグメントを独自のタグでトランザクションに追加します (後で取得するため)。

ユーザーはアクティビティと対話し、方向を変更します。アクティビティが破棄され、再作成されます (通常のアクティビティのライフサイクルとして)。これで、else に入ります。フラグメントは null ですfragment = getSupportFragmentManager().findFragmentByTag(getFragmentTag());。fragmentManager が保持する正しい Fragment を返す a を実行します。

問題は、このフラグメントが破棄された古いアクティビティへの参照を保持しているため、fragment.getActivity を実行すると null が返されることです。アクティビティへのフラグメント参照を新しく再作成されたアクティビティに更新するにはどうすればよいですか?

更新:より正確に言うと、新しい検索を取得したときに onNewIntent を呼び出す SearchActivity を使用しています。したがって、実際の操作は次のとおりです->ユーザーが検索を行う->検索が正しく表示される->ユーザーが方向を変更すると、結果が正しく表示されます(ユーザーが結果を操作する場合は問題ありません)->ユーザーが検索ボタンから新しい検索を行い、これは、新しいインテントを検索ロジックを持つフラグメントにディスパッチする SearchActivity の onNewIntent を呼び出します。ここでは、アクティビティへの参照が null であるためクラッシュします

4

4 に答える 4

1

いつ、どこに電話していますgetActivity()か?アクティビティ参照は自動的に更新されますが、すぐには更新されません。onActivityCreated()が呼び出された後は、安全にアクセスできるはずです。

于 2012-06-13T11:01:42.117 に答える
0

setRetainInstance(true)-はい、それが解決策です(タグごとにフラグメントを検索します。これは、再度インスタンス化するためです-間違った方法です-バックグラウンドルーチンが進行中の可能性があります)。それ以外の場合、setRetainInstance(false)を使用していると、問題が再発する可能性があります。私も似たようなものを持っていました。私の場合-ローダーを(バックグラウンドで)使用したためです。解決策は簡単でした。フラグメントのonDestroy()メソッドでフラグメントのローダーを破棄することです。

于 2012-10-16T08:28:33.343 に答える
0

else部分からnullチェックを削除するだけです if ( fragment == null ) { fragment = getSupportFragmentManager(......向きの変更時に作成された新しいフラグメントでフラグメントを更新しましょう.....。

于 2012-06-13T11:05:53.557 に答える