본문 바로가기

IT

특정 기기에서 DatePickerDialog, TimePickerDialog에서 '설정', '취소' 가 나오지 않고 '저장'으로 표시되는 경우

반응형

 내 LG의 LTE2 모델의 경우 저런 오류(?)가 발생한다. 저렇게 표시만 되면 다행인데, 취소버튼이 없어서 뒤로가기 버튼을 눌러도 '설정'버튼을 누른 이벤트가 정상적으로 실행이 되고, '저장'버튼을 누른 경우 '설정'버튼을 누른 것 같은 이벤트가 2회 발생한다.


 구글링결과 안드로이드 특정 버전에서 위와 같은 오류가 알려져있다고 한다.


 이를 해결하기 위해서 소스를 간단히 수정해 보았다.


// 한번만 실행하기 위한 체크변수
int nCheck = 0;

@Override
protected Dialog onCreateDialog(int id) {
	switch (id) {
	case DATE_DIALOG_ID: // 날짜선택 다이얼로그 호출
		DatePickerDialog dialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
			@Override
			public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
				if (nCheck == 0) {
					nCheck = 1;
					/** 프로그램에 맞게 수정하는 메소드 */
					updateDisplayForDate(year, monthOfYear, dayOfMonth);
				}
			}
		}, nYear, nMonth, nDay);
		dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
			@Override
			public void onCancel(DialogInterface dialog) {
				nCheck = 1;
				removeDialog(DATE_DIALOG_ID);
			}
		});
		dialog.setButton(DatePickerDialog.BUTTON_NEGATIVE, "취소", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// '취소'버튼에 대한 이벤트 처리
				nCheck = 1;
				removeDialog(DATE_DIALOG_ID);
			}
		});
		dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
			@Override
			public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
				// 뒤로가기 버튼에 대한 이벤트 처리
				if (keyCode == KeyEvent.KEYCODE_BACK) {
					nCheck = 1;
				}
				return false;
			}
		});
		return dialog;
	}
}


@Override
protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
	if (id == DATE_DIALOG_ID) {
		if (((DatePickerDialog)dialog).getButton(DatePickerDialog.BUTTON_POSITIVE) != null) {
			((DatePickerDialog)dialog).getButton(DatePickerDialog.BUTTON_POSITIVE).setText("설정");
		}
		nCheck = 0;
	}
}

급하게 수정하여 배포해야 하는 프로그램이 있어서 좀 어거지스럽게(?) 코딩을 하였습니다.


끝.

반응형