마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

TimePicker 버그인지 봐주세요 [closed]

0 추천

진저브레드까지 지원하는 앱을 개발하고 있습니다.

초단위까지 지원하는 TimePicker가 필요하여 기본 TImePicker와 Button, TextView를 이용한 조잡한 다이얼로그를 만들어 사용하였습니다.(동작 잘됨)

그래서 이번엔 layout-v11을 따로 만들어서 허니콤 이전 버전은 기존 다이얼로그를 사용하고 허니콤 후 버전은 layout-v11에 있는 앨리어스 xml을 사용하도록 하고, 새 xml에는 TimePicker와 NumberPicker를 LinearLayout으로 묶었습니다.

그리고 onCreateDialog에서 updateDialog를 콜해서 TimePicker랑 NumberPicker에 제가 넣고 싶은 시각을 셋팅합니다.

public Dialog onCreateDialog(Bundle savedInstanceState) {
// view 셋팅 ....
updateDialog();
}
	protected void updateDialog() {
		Log.i(TAG, "updateDialog called");
		timePicker.setCurrentHour(mPickerTime.get(Calendar.HOUR_OF_DAY));
		timePicker.setCurrentMinute(mPickerTime.get(Calendar.MINUTE));

		if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
			secondTextField.setText(String.valueOf(mPickerTime
					.get(Calendar.SECOND)));
		} else {
			secondPicker.setValue(mPickerTime.get(Calendar.SECOND));
		}
	}

 

 

그리고 아래 콜백을 오버라이딩했습니다.

timePicker.setOnTimeChangedListener(new OnTimeChangedListener() {
	@Override
	public void onTimeChanged(TimePicker view, int hour, int minute) {
		mPickerTime.set(Calendar.HOUR_OF_DAY, hour);
		mPickerTime.set(Calendar.MINUTE, minute);
		getArguments().putSerializable(EXTRA_TIME, mPickerTime);
		Exception ex = new Exception();
		ex.printStackTrace();
	}
});

젤리빈 디바이스에서 테스트 해보면 실제 inflate도 잘되고

getTargetFragment().onActivityResult(getTargetRequestCode(),
				resultCode, i);

코드도 잘 동작하는 등 에러나는 것은 없는데, 유독

최초 Dialog를 show할 때 아무런 터치도 없었는데 오버라이딩한 onTimeChanged(..) callback이 난데없이 호출되면서 꼭 Minute Picker만 현재 시스템 시각의 분으로 바꿔버립니다. Hour부분이랑 NumberPicker는 제가 지정한대로 이상 없이 잘 동작하고요.

Exception ex = new Exception();
ex.printStackTrace();

위에 코드를 넣어서 onTimeChanged(..)의 콜스택을 봐도 잘 모르겠고요, Hour도 같이 바뀌면 제가 실수했구나 하는데 Minute만 바꾸는 onTimeChanged(..)가 호출되니 미치겠네요.

06-25 14:52:12.544: I/TimePickerFragment(894): updateDialog called
06-25 14:52:12.554: W/System.err(894): java.lang.Exception
06-25 14:52:12.564: W/System.err(894): 	at com.sephiron.clocksynchronizer.TimePickerFragment$1.onTimeChanged(TimePickerFragment.java:75)
06-25 14:52:12.564: W/System.err(894): 	at android.widget.TimePicker.onTimeChanged(TimePicker.java:649)
06-25 14:52:12.564: W/System.err(894): 	at android.widget.TimePicker.setCurrentHour(TimePicker.java:471)
06-25 14:52:12.564: W/System.err(894): 	at android.widget.TimePicker.setCurrentHour(TimePicker.java:446)
06-25 14:52:12.574: W/System.err(894): 	at com.sephiron.clocksynchronizer.TimePickerFragment.updateDialog(TimePickerFragment.java:181)
06-25 14:52:12.574: W/System.err(894): 	at com.sephiron.clocksynchronizer.TimePickerFragment.onCreateDialog(TimePickerFragment.java:153)
06-25 14:52:12.574: W/System.err(894): 	at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:295)
06-25 14:52:12.574: W/System.err(894): 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938)
06-25 14:52:12.574: W/System.err(894): 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
06-25 14:52:12.574: W/System.err(894): 	at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
06-25 14:52:12.574: W/System.err(894): 	at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
06-25 14:52:12.584: W/System.err(894): 	at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446)
06-25 14:52:12.584: W/System.err(894): 	at android.os.Handler.handleCallback(Handler.java:733)
06-25 14:52:12.584: W/System.err(894): 	at android.os.Handler.dispatchMessage(Handler.java:95)
06-25 14:52:12.584: W/System.err(894): 	at android.os.Looper.loop(Looper.java:136)
06-25 14:52:12.584: W/System.err(894): 	at android.app.ActivityThread.main(ActivityThread.java:5017)
06-25 14:52:12.584: W/System.err(894): 	at java.lang.reflect.Method.invokeNative(Native Method)
06-25 14:52:12.584: W/System.err(894): 	at java.lang.reflect.Method.invoke(Method.java:515)
06-25 14:52:12.584: W/System.err(894): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
06-25 14:52:12.584: W/System.err(894): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
06-25 14:52:12.584: W/System.err(894): 	at dalvik.system.NativeStart.main(Native Method)
06-25 14:52:12.904: W/EGL_emulation(894): eglSurfaceAttrib not implemented

무엇이 잘못된지 아시는 분 계신가요?

질문을 종료한 이유: 해결되었습니다.
익명사용자 님이 2014년 6월 25일 질문
2014년 6월 26일 closed
...