2013/01/28

Android:DialogFragment.setRetainInstance(true)使用時は画面回転に注意


DialogFragmentにsetRetainInstance(true)を指定する時は注意が必要です。
下記の手順を踏むと、表示中のダイアログが閉じてしまいます。

【手順】
 1. DialogFragmentを生成し、setRetainInstance(true)を指定
 2. DialogFragmentを.show(...)メソッドで表示
 3. 画面の向きを変更する(Orientation change)

【結果】
手順2で表示したダイアログが閉じてしまいます(画像1)。
しかし、setRetainInstance(false)を設定している場合ダイアログは閉じません(画像2)。
画像1:setRetainInstance(true)

画像2:setRetainInstance(false)


setRetainInstance(true)の場合でもダイアログを閉じたくなければ、次の回避策を使います。
# コードが汚れる上に力技です。

【回避策】
onDestroyView()でsuper.onDestroyView()をコールする前に、ダイアログが持つDismissメッセージをnull化します。
@Override
public void onDestroyView() {
    if (getDialog() != null && getRetainInstance())
        getDialog().setDismissMessage(null);
    super.onDestroyView();
}
ダイアログが閉じる原因はOrientation changeによるDialogFragmentのonDestroyViewで、
Dialog.dismiss()によりメッセージキューにpushされたDISSMISSメッセージが、onCreateView後に再活性化されるためです。
この結果、ダイアログは表示された直後にdismissされてしまいます。

回避策の内容は、Orientation changeによるonDestroyViewでは、Dismissメッセージをnull化して投げさせない対応となります。

以上です。
2013/01/24

Android:manageSpaceActivityによるデータ管理




アプリ管理画面(右図)には、アプリデータを削除するためのボタン[データを消去]が用意されています。
この機能はデータベースを含むアプリデータ全てを消去するものです。
つまり、消去の対象には"アプリの設定情報"も含まれます。

ユーザはストレージの空き容量を確保する目的でこの機能を使用することがあります。
しかし、アプリデータの全削除が空き容量を確保するためのベストな手段とは限りません。
「アプリの設定情報は残して、不要で無駄にサイズの大きなデータを削除したい」と思うユーザもいるでしょう。
このような場合は、"アプリデータ管理用Activity"の採用を検討します。


●ManageSpaceActivity

開発者は[データを消去]ボタンが押された場合に、データの消去ではなく
指定のActivityを起動するようカスタマイズすることができます。

指定するにはAndroidManifest.xmlで下記のように、applicationタグの
android:manageSpaceActivity属性に、起動したいActivity名を指定します。
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:manageSpaceActivity=".DataManagementActivity" >
    <activity
        android:name=".DataManagementActivity"
        android:label="@string/label" >
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
これを指定すると、[データを消去]ボタンが[容量を管理]ボタンに変更され、
ボタン押下時に指定のActivityが起動されます。


ユーザに全消去以外の選択肢を提供したい場合に使えるテクニックです。

以上です。