3

フラグメントが最初に作成されてからアクティビティに再アタッチされたときに、フラグメントのコールバックで取得するsavedInstanceState バンドルに関して質問があります。

そのため、setRetainInstance(true) を使用します。その結果、フラグメントは破棄されるべきではありませんが、アクティビティが破棄されたときにアクティビティからアタッチされず、たとえば構成変更でアクティビティが再作成されたときに再びアタッチされます。

したがって、この setRetainInstance(true) を使用すると、savedInstanceState バンドルが次onActivityCreated()ようなフラグメントのコールバックで常に null になるためですonCreate()

これまでのところ、このsavedInstanceStateがフラグメントでnullではないことが原因で、一部のユーザー(非常に少数)からクラッシュが発生しています。

したがって、 onActivityCreated() コールバックは次のようなことをしています:

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        adapter = new CustomAdapter(getActivity(), getListView(), data, savedInstanceState);
        setListAdapter(adapter);
        setupEmptyListView();
        getListView().setOnScrollListener(this);
    }

CustomAdapter は、ある時点でそのコンストラクターから、loadInstanceState()そのジョブを実行するメソッドを呼び出しています。以下のコード:

@Override
    public void loadInstanceState(Bundle savedInstanceState) {
        if (savedInstanceState != null) {
         //do some stuff which is causing a crash
        }
    }

今私の質問は、私が渡しているsavedInstanceStateが常にnullである必要がある場合、どのようにしてそのifステートメントに入ることができるかということです。

そして今、質問

Androidは setRetainInstance(true) 、コールバックに渡されるsavedInstanceStateバンドルがフラグメントで使用するときに常にnullになることを保証していますか?

答えてくれてありがとう!

4

1 に答える 1

1

この場合、savedInstanceState バンドルが null でなければならないという言及は見つかりませんでした。公式ドキュメントには次のように書かれています。

public void setRetainInstance (ブール値保持)

アクティビティの再作成 (構成の変更など) の間、フラグメント インスタンスを保持するかどうかを制御します。これは、バック スタックにないフラグメントでのみ使用できます。設定されている場合、アクティビティが再作成されると、フラグメントのライフサイクルがわずかに異なります。

onDestroy() は呼び出されません (ただし、フラグメントが現在のアクティビティから切り離されているため、onDetach() は呼び出されます)。

フラグメントが再作成されていないため、onCreate(Bundle) は呼び出されません。

onAttach(Activity) とonActivityCreated(Bundle) は引き続き呼び出されます。

それが主な違いです - ライフサイクルが変わりました。

于 2013-03-21T11:11:59.423 に答える