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