DatePickerとTimePicker
今回はAndroidのDatePickerとTimePickerを試してみた。
日付と時間を同時に設定できるウィジェットが何故か存在しないため、
DatePickerとTimePickerを組み合わせてみた。
こんな感じ
只、TimePickerクラスをよく理解していなかった為、実装するのに結構時間がかかってしまった。
TimePickerの[+][-]をクリックするたびOnTimeChangeイベントが発生する。
このイベントが発生したタイミングで”時”、”分”の更新するように、自前でロジックを書くものだと勘違いしていた。下記は間違ったOnTimeChangeの実装について
public class DateTimePickerActivity extends Activity implements OnDateChangedListener, OnTimeChangedListener{ ・ ・ ・ @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { view.setCurrentHour(hourOfDay); view.setCurrentMinute(minute); Log.d(TAG, "Hour" + hourOfDay + "Minute" + minute); } |
この実装でアプリケーションを動作させて、OnTimeChangedイベントが発生すると、
java.lang.StackOverflowErrorが発生します。
いくら考えても原因が解らないため、APIのソースを見る事にしました。
http://code.google.com/p/mobile-time-care/source/browse/trunk/src/es/acsblog/TimePicker.java?r=6
public class TimePicker extends FrameLayout { ・ ・ ・ private void onTimeChanged() { mOnTimeChangedListener.onTimeChanged(this, getCurrentHour(), getCurrentMinute()); } ・ ・ } |
自前でわざわざ時、分を更新する必要なかったんですね!(`Д´)ノ
下記にDatePickerとTimePickerの使ったサンプルを載せておきます。
DateTimePickerActivity
package sample.controll; import android.app.Activity; import android.os.Bundle; import android.widget.DatePicker; import android.widget.TimePicker; import android.widget.DatePicker.OnDateChangedListener; import android.widget.TimePicker.OnTimeChangedListener; import java.util.Calendar; import android.util.Log; public class DateTimePickerActivity extends Activity implements OnDateChangedListener, OnTimeChangedListener{ public static String TAG = "DateTimePickerActivity"; private int lastMinute; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.detepicker); DatePicker datePicker = (DatePicker)this.findViewById(R.id.DatePicker01); TimePicker timePicker = (TimePicker)this.findViewById(R.id.TimePicker01); //SetDate int nowYear; int nowMonth; int nowDay; int nowHour; int nowMinute; Calendar c = Calendar.getInstance(); nowYear = c.get(Calendar.YEAR); nowMonth = c.get(Calendar.MONTH); nowDay = c.get(Calendar.DAY_OF_MONTH); nowMonth += 1; datePicker.init(nowYear, nowMonth, nowDay, this); //SetTime nowHour = c.get(Calendar.HOUR_OF_DAY); nowMinute = c.get(Calendar.MINUTE); timePicker.setCurrentHour(nowHour); timePicker.setCurrentMinute(nowMinute); timePicker.setOnTimeChangedListener(this); lastMinute = nowMinute; Log.d(TAG, "Make is Finish"); } @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // TODO Auto-generated method stub view.updateDate(year, monthOfYear, dayOfMonth); Log.d(TAG, "Year" + year + "Month" + dayOfMonth + "Day" + dayOfMonth); } @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { // TODO Auto-generated method stub if ((lastMinute == 59) && (minute == 0)) { hourOfDay++; } else if ((lastMinute == 0) && (minute == 59)) { hourOfDay--; } else { lastMinute = minute; Log.d(TAG, "Hour" + hourOfDay + "Minute" + minute); return; } lastMinute = minute; view.setCurrentHour(hourOfDay); Log.d(TAG, "Hour & Time Change ..." + "Hour" + hourOfDay + "Minute" + minute); } } |
datepicker.xml
|
AndroidManifest.xml
|
参考にさせていただいたサイト
http://racjonalny.blogspot.com/2010/01/android-timepicker-enhancement.html
http://www.adakoda.com/android/000103.html