15

DialogFragmentについて質問があります。デバイスを回転させた後もその状態を維持するダイアログを作成しようとしています。このダイアログには、アダプターやその他の重いオブジェクトなどへの参照がたくさんあります。可能であれば、onSaveInstanceStateを使用してそれらを保存および復元するために、すべての参照をParcelableまたはSerializableにする必要なしに、ローテーション時にこれを保持する必要があります。元のアクティビティが再作成されます。

DialogFragmentにsetRetainInstance(boolean)というメソッドがあり、アクティビティが再作成されたときにダイアログフラグメントインスタンスを保持できることに気付きました。ただし、デバイスを回転させると、ダイアログが表示されなくなります。アクティビティのFragmentManagerから取得できることはわかっていますが、再度表示する方法が見つかりません。これに関する提案はありますか?

ありがとう、ミハイ

4

2 に答える 2

24

あなたがする必要があるいくつかのことがあります:

  1. インスタンスファクトリメソッドを使用して、次のようなDialogFragmentインスタンスを開始します。

    public static MyDialogFragment newInstance(MyModel model) {
        MyDialogFragment myDialogFragment = new MyDialogFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable("MODEL", model);
        myDialogFragment .setArguments(bundle);
        return myDialogFragment;
    }
    
  2. onCreateにsetRetainInstance(true)を配置すると、元のアクティビティが再作成された後も、フラグメントで宣言されたすべての参照が保持されます。

    @Override
    public void onCreate(Bundle icicle) {
        this.setCancelable(true);
        setRetainInstance(true);
        super.onCreate(icicle);
    
    }
    
  3. これを行うことにより、回転時に消えないようにします

    @Override
    public void onDestroyView() {
        if (getDialog() != null && getRetainInstance())
            getDialog().setDismissMessage(null);
        super.onDestroyView();
    

    }

  4. を使用してオブジェクトを取得します

    (MyModel) getArguments().getSerializable("MODEL")
    
于 2012-12-24T02:14:00.123 に答える
0

次の操作を行う限り、ダイアログフラグメントは自動的に保存されます。

  1. アクティビティonSaveInstanceState()を呼び出す場合は、必ずスーパー関数を呼び出してください!!!! 。私の場合、それが鍵でした。また、フラグメントでも同じことを行うようにしてください。
  2. を使用する場合はsetRetainInstance、値を手動で保存する必要があります。そうでなければ、ほとんどの場合、それについて心配することはできないはずです。もう少し複雑なことをしている場合は、そうする必要があるかもしれませんがsetRetainInstance(true)、それ以外の場合は無視してください。
  3. 一部の人々は、サポートライブラリのバグについて不満を言っています。このバグでは、却下メッセージが送信されるべきではないときに送信されます。最新のサポートライブラリで修正されているようですので、心配する必要はありません。
于 2013-12-31T11:21:48.387 に答える