私の問題を説明しようとします:
私のすべてのフラグメントは 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 であるためクラッシュします