2011年7月23日土曜日

ひさびさのAndroidネタ

最近はもっぱらStruts2の開発に没頭していたので、なかなかAndroidネタはありませんでした。

ここに来て、公開しているアプリのバージョンアップを行ったので、その中から一つ

プリファレンスについては各種設定を行う処理を簡単に作成できるので便利なんですが、画面がある程度決まってしまうので独自の画面構成は難しくなってしまいます。
一応、Preferenceタグがあって独自のレイアウトを利用することも可能ですが、独自レイアウトを行った場合に独自の処理を追加したくなりますが、これが簡単にはいきませんでした。

今回は、ボタンを利用した処理を追加したかったのですが、レイアウトjに配置したボタンのsetOnClickListener()を呼び出すタイミングでちょっとはまってしまいました。

Preferenceを継承したクラスでsetOnClickListener()を呼び出すのですが、ある程度汎用的に使えるようにと考えて、PreferenceActivity側でOnClickListener()を定義できるようしました。これで、ボタンを使ったプリファレンスの使いまわしができるようになります。

とりあえずPreferenceを継承したクラスでsetOnClickListener()メソッドを用意して、引数のOnClickListener()クラスのオブジェクトを自分のボタンにsetOnClickListener()するという準備をしておきます。次に、PreferenceActivityのonResume()でgetPreferenceScreen().findPreference("hoge")でボタンを配置したPreferenceを取得して、setOnClickListener()でリスナーを登録するということにしました。

ところが、どうやらPreferenceActivityのonResume()のタイミングではPreferenceを継承したクラスがまだ生成されていない場合があるようです。これは、プリファレンスの項目が多くて画面におさまらずに、該当のボタンを配置したPreferenceがまだ画面に表示されていないようなケースで発生するようです。

結局、用意したsetOnClickListener()メソッドではリスナーをメンバ変数に保存して、Preferenceを継承したクラスのsetOnClickListener()で、ボタンに対してsetOnClickListener()することで解決しました。

0 件のコメント:

コメントを投稿