かなり久しぶりの記事投稿です。
最近転職して、実務としてAndroidアプリを開発するという仕事もあり、その仕事中で気付いた事とか困ったときの解決方法等、これからは投稿していきたいと思いますので、宜しくお願いいたします。
今回の記事は、Spinnerに関するトピックになります。Spinnerは、もちろんユーザによる操作で選択肢を変える事が出来ますが、プログラムからコードで選択肢を変更してやる事も出来ます。
で、今回実装したかった事は、以下のような仕様です。
・とある状態ではユーザ手動によるSpinnerの選択肢変更を不可とする。但し、プログラムからの変更は許容したい。
・ユーザ手動によるSpinner変更時、もし選択肢変更不可の場合は、Dialog表示等で、禁止している事を知らせたい。(フリーズしているわけではないと知らせたい為)
SpinnerのsetEnabled()では、活性/不活性の切り替えが出来ますが、不活性としてしまうと、プログラムからの書き換えも出来ないはずなので、これは不可です。
かといって、SpinnerのOnItemSelectedイベントで、現在手動操作禁止状態かどうかを判定して、禁止状態であれば選択肢を元に戻す、なんて泥臭い事もしたくありません。
で、試行錯誤して以下のような実装としました。
・ユーザによる選択肢変更のみを不可とする方法
Spinnerで用意されているメソッドで対応出来ました。以下のメソッドを使います。
Spinner spinner = (Spinner) findViewById(R.id.sample_spinner);
spinner.setClickable(false);
SpinnerのsetClickableメソッドを利用すればOKです。
禁止したい状態になれば、引数にfalseを設定してやればユーザ手動による操作は不可となりますが、プログラムからの変更操作は受け付けてくれます。
禁止を解除したい状態になれば、引数にtrueを設定しましょう。
・手動操作禁止時にSpinnerをタップされたイベントを受け取る方法
先ほどの処理により、手動操作禁止状態でSpinnerに触られても、選択肢変更時に発生するOnItemSelectedイベントは上がってこなくなってしまいますので、別のイベントを捕捉してやる必要があります。
Spinnerでは、「setOnClickListener」「setOnItemClickListener」は使えない(コンパイルは通りますが、実際に設定すると実行時にExceptionがスローされる)ようですので、他のイベントリスナーを使う必要があります。
「setOnTouchListener」というリスナーが使えます。
コードのイメージとしては以下のような感じです。
—省略—
spinner.setOnTouchListener(new SpinnerListener());
—省略—
private Class SpinnerListener implements OnTouchListener{
public boolean onTouch(View v, MotionEvent event) {
//手動操作禁止状態ならDialog表示
—省略—
}
}
上記のような感じで実装してやれば、今回私がやりたかった事は実現出来ました。
今回の実装を行うにあたり、ネット上で調べてみたのですが、あまりこのようなサンプルは見かけなかったので、今回紹介させて頂きました。
今回は以上です。