WordPress6.7.1に更新しました
【Androidアプリ開発】TimePickerDialogを実用的に使う方法

【Androidアプリ開発】TimePickerDialogを実用的に使う方法

2020年5月2日

こんにちは、コンテンツクリエイターのともすけです。

この記事の内容は、初心者向けよりすこし難しいです。

Androidアプリを作る際に使用する部品の1つにTimePickerDialogがあります。後半で具体的な記述例を示しますので、お急ぎの方は下の方へスクロールしてください。

tomosuke
tomosuke

それってどういうやつなの?

これです。

TimePickerDialog

時間を指定して分を指定して、OKを押して使います。ですが…問題が。

tomosuke
tomosuke

何が問題なの?

Android Developerサイトにサンプルが書かれているのですが、設定した値を取り込む方法が書かれていません。つまりはこういうこと。

*Android Developerサイトから引用

この記述をTimePickerDialog.javaとしてプロジェクトに組み込み、

*Android Developerサイトから引用

をプログラム上で呼び出せばいいと書いてあります。呼び出すと、先程の画面が表示されます。入力を終えてOKを押すと、onTimeSetメソッドが呼び出されます。サンプルコードにも、英語で何かをしてねと書かれています。そう、ここに書けというんです。

tomosuke
tomosuke

で、何が問題なの?

設定された値をどうやって呼び出し元のclassに渡すか。ウェブ上に点在する記事によれば、どれもログを表示するとか、その程度の実用レベルとは程遠い例しかないんです。表示するだけでは意味がないんです。制御に使えないと意味がないんです…。

tomosuke
tomosuke

何か対策はないの?

SharedPreferencesを使おうかとも思いましたが、これは値を書き込んだ後すぐに反映されない場合があって、そのため呼び出し元ですぐにリードすると設定した値が読めないことが多々あります。

いろいろ調べたり考えたりして、1つ気がついたことがありました。

第2引数がthisなんですけど、これはlistener型なんです。listenerって、これのことです。

二行目に、OnTimeSetListenerと書かれています。このように書くと、時間設定が終わってOKが押されたときに

が呼び出されるということなんです。

tomosuke
tomosuke

うんうん、それで?

Dialogのclassにlistenerを記述しないで、呼び出し元に定義し、それを指定すればいいということなんです。つまり、Dialogのclass記述は結果的には

となります。修正内容は、

  • listenerを他で定義するので、implementsの行はコメントアウト
  • returnの行で、第2引数がthisとなっていたところは(RegisterActivity)getActivity()となります。RegisterActivityは、TimePickerDialogを呼び出す元のActivityです。呼び出し元は人によって違うので、参考程度としてください。
  • 呼び出し元のActivityにimplements…の行を追加して、public void onTimeSet(上に書いてあった定義)を追加し、その中に適切な記述を書きます。

こうすると、呼び出し元で設定された値を取得できるので、その値を使って各種制御に使えることになります。

tomosuke
tomosuke

そっかー、そういうことなんだね!(わかったつもり)

いかがでしょうか。ポイントは、Dialogを定義するclassの中にlistenerを設定せず、呼び出し元のclassに定義して呼び出すことです。

MainActivityのサンプルを掲載しておきますね。

それではまた