Android の PreferenceDialog のカスタマイズに苦戦した話…

Androidで PreferenceActivity を作っていた時のこと・・・

僕は AndroidX サポートライブラリを使っていて、「設定ダイアログのカスタマイズってどうやるのかな~」と疑問だったので調べてました。

そうすると情報は出てくるけど、手順が複雑そうな感じです。

  • DialogPreference  の仕様が変わったとか、
  • PreferenceFragmentCompat  を使えとか、
  • onDisplayPreferenceDialog  でアレコレしろとか、

色んな情報が出てきたけど,サンプル的なのがなくて苦戦

1日かけて、やっとPreferenceのダイアログのカスタマイズができました。

そこで忘備録も兼ね Preferenceでダイアログをカスタマイズする手順 をまとめます。

Preferenceでのダイアログのカスタマイズ手順

今回はサンプルとして、こういう設定を想定したダイアログを作ってみます。

  • 色名を選択する Preference  を作成
  • タッチすると色名選択ダイアログが開く
  • 色が選ばれたら Preference  に値保存

実用性皆無だけど、サンプルということで・・・

こういう設定ダイアログを作る手順は次の通りです。

1.Preferenceを継承したクラスを作る

まず専用の Preference  クラスを作成

ここでは ColorNamePreference  という名前で作成してみました。

その名の通り、色名を保持する目的だけのPreferenceクラス

▼ そのコードがコチラ

全部説明するとキリがないので、何をしてるかはコメント参照

ダイアログをカスタマイズするときは、こういう風に Preference  を拡張したクラスを作っておくと設定の管理がしやすくなります。(なくてもできるけど面倒くさくなる)

2.PreferenceDialogFragmentCompat を拡張したクラス作成

お次は PreferenceDialogFragmentCompat  の拡張

これを拡張することで、オリジナルのPreferenceダイアログが作れます。

 

今回はサンプルなので、色名を選択するダイアログ を作ってみました。

▼ そのダイアログのコード例はこんな感じ

何をしてるかはコメント参照

一応説明しておくと、特に大事なのは次の3つ

  • newInstanceメソッド
    必ずこれを作っておく。カスタマイズしたダイアログ表示に使われる
  • onPrepareDialogBuilderメソッド
    この中でダイアログに OnClickListener  とかボタンの設定ができる
  • onDialogClosedメソッド
    ダイアログが閉じられると呼ばれ、もしOKボタンが押されてたら Preference  に値を保存する

この部分が中々情報が少なくてもコードを書くのに苦戦してしまった・・・

でもこういう感じでカスタマイズすればいいと分かれば簡単です。

3.PreferenceActivityのレイアウト作成

次に拡張した Preference をレイアウト上に設置します。

例えばさっきの ColorNamePreference  ならこういう感じです。

▼ root_preferences.xml に追加しておく

さっき作った ColorNamePreference  をレイアウト上にそのまま書けばいいだけ

4.PreferenceFragmentCompat内でダイアログ呼び出し

最後に PreferenceActivity でダイアログの表示を制御

具体的には PreferenceFragmentCompat  を継承したクラスを作ったので、その中の onDisplayPreferenceDialog  メソッド内でダイアログフラグメントを呼び出すだけです。

 

言葉だと分かりにくいので実際のコードで示すと次みたいな感じ

▼ PreferenceActivity内で・・・

SettingsActivity内で必要なのはこれだけ

たったこれだけだけど、この方法もよくわからなくて苦戦したポイントです。

実際にカスタマイズしたダイアログを表示してみた

実際にどういう感じで表示されるかは次の通り

▼ 設定画面で色名選択をタッチ

作成した設定画面からカスタマイズしたダイアログを表示してみる

▼ カスタムしたダイアログが表示された

カスタマイズした PreferenceDialog が表示出来た

▼ 好きな色名を選んでOKを押すと・・・

ダイアログから適当に項目をクリックすると・・・

▼ ちゃんと設定が保存されて反映された

Preferenceに値が反映された。ダイアログのカスタマイズは成功

Preferenceとして機能してくれてます。

難しそうに思ってたけど、やってみると意外と簡単ですね。ではまた($・・)/~~~