2011-11-10 10 views
5

私は、(複合)オブジェクトを編集するための単純なDialogFragmentを作成する方法を理解するのに苦労しています。名前と姓のPersonとそれぞれの列挙型(仕事、家など)と住所。Android DialogFragmentと設定の変更

まず、PersonオブジェクトをDialogFragmentに正しく渡すにはどうすればよいですか?私の現在のソリューションは、DialogFragmentが作成された後で、dialog.show()の前に呼び出されるsetPerson(Person person)メソッドを持っています。これは、構成の変更が発生するまで(ユーザーが画面を回転させる)、正常に機能します。 DialogFragmentが再作成され、私のPersonオブジェクトへの参照がnullです。私はonSaveInstanceStateを使用してインスタンスを保存することができますが、オブジェクトは複雑で高価であり、このように大きなオブジェクトを持続させることは無駄に見えます。

また、ダイアログを使用するアクティビティの設定変更を無効にしようとしましたが、問題を修正しましたが、ダイアログを再利用可能にして、設定変更を無効にするために

第3のオプションは、Personへの参照を静的変数に保存することですが、再度、ダイアログを再利用可能にして複数のインスタンスをサポートできるようにします。

高価で複雑なオブジェクトを再利用可能なダイアログでどのように扱うのですか?

答えて

2

まあ、いくつかのソリューションがありますが、編集中のオブジェクトを完全にシリアル化できない場合は、どれも素晴らしいものではありません。

絶対に100%避けられない限り、android:configChanges="orientation"を使用することはお勧めできません。他の設定が変更されていて、そのソリューションを使用している場合、あなたのアプリは他のユーザーと引き分けになります。

しかし、大部分のケースで機能する簡単な解決策は、DialogFragmentでsetRetainInstance(true)と呼ぶことです。これにより、構成の変更時にフラグメントが破棄されて再作成されなくなります。しかし、これがうまくいかない場合があります。 OSがメモリを節約するためにアクティビティやアプリを '氷上に置く'ような設定変更以外の理由もあります。この場合、オブジェクトは失われます。

1

断片に複雑なオブジェクトを渡すためにクリーンな方法は、オブジェクトがParcelableを実装するBundleにオブジェクトを追加し、fragment.setArguments(bundle)Fragmentにバンドルを通過させることです。フラグメントのonActivityCreated()にオブジェクトを展開するには、を呼び出してバンドルを取得します。

、構成変更に引数を永続単に断片の方法によって提供されるバンドルに「作業」parcelableオブジェクトを保存し、savedInstanceState !=null場合、後onActivityCreated()に引数をアンパックします。

Parcelableを実装した場合のパフォーマンスが著しく低下したり、ある種の「ライブ」オブジェクトがある場合は、データオブジェクトを保持するための非UIフラグメントを作成することもできます。詳細がわからない場合は、setRetainInstance(true)をUI以外のフラグメントで作成し、Activityのインターフェイスを使用してUIフラグメントとの接続を調整することができます。

関連する問題