2011-12-23 4 views
9

우리는 DatePickerDialog에서 1970 년 1 월 1 일 이전에 날짜를 설정할 수 없다고보고 한 회원이 있습니다. 이 문제는 우리를위한 책략이 아닙니다.DatePickerDialog가 1970 년 1 월 1 일의 최소 날짜를 잘못 적용했습니다.

DatePickerDialog가 기본 DatePicker의 setMinDate/setMaxDate 함수를 노출하지 않는다는 것을 이미 알고 있으므로 일부 핸드셋 제조업체 별 수정이 minDate/maxDate에 영향을 미치는 것으로 보입니다.

이 사용자는 그가 Verizon 실행 2.2 Froyo에서 Droid x2를 실행하고 있다고보고합니다. 우리는 그가 자신의 장치 모델에 대한 설명이 정확하다고 믿지만 많은 사용자들은 OS 버전에 대해 혼란스러워서 2.3을 돌릴 수 있습니다. 내 활동에이 테마 (내 테스트 장치에 갤럭시 탭 원본을 DatePickerDialog를 제약의 의도 된 효과를 가지고 있지만

<style name="profile_editor_theme">  
    <item name="android:endYear">2025</item> 
    <item name="android:startYear">1910</item> 
</style> 

:

나는 나의 활동에이 테마를 추가하여이 문제를 해결하기 위해 시도 Motorola Droid), 사용자에게는 아무런 영향이 없었습니다.

이 문제는 우리 사용자에게 100 %의 시간을 알려주지 만 우리 회사의 장치에서는 올바르게 작동합니다.

누구든지이 문제의 원인과 해결 방법을 설명 할 수 있습니까?

나는이 문제에 관해 filed this bug against Google이 있습니다.

감사합니다.

+0

동일한 사용자의 문제 (Droid x2 사용자 포함)에서 몇 분의 같은 문제가보고되고 있으며 집에서 다시 복구 할 수 없습니다. – greg7gkb

+0

또한 Motorola Razr의 repros – HannahMitt

+0

누구나 업데이트가 있습니까? 우리는 여전히 현장에서 그 보고서를보고 있습니다. ... 불행히도 Razr에 액세스 할 수 없습니다. ( – greg7gkb

답변

2

Android 기기의 시작일은 1970 년 1 월 1 일부터 시작됩니다. 아마도이 경우 일 수 있습니다. Android는 1970 년 1 월 1 일 이후로 경과 된 시간 (밀리 초)을 계산합니다.

귀하의 사례에 대해 해킹을 발견했습니다. 여기에 동적으로 날짜 선택기 만들기 : 매니페스트 파일에서

 DatePicker dp = new DatePicker(this); 
    dp.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    v.addView(dp); 

나는 내 응용 프로그램에 대한 사용자 지정 테마를 선언 - 나는 응용 프로그램에 대해 동일한 테마를합니다. 그런데 당신은 활동을 위해 똑같이 할 수 있습니다. styles.xml에서

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/CustomTheme"> 
    <activity 
     android:name=".HelloDatePickerActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

나는이 작업을 수행 :

<style name="CustomTheme" parent="android:Theme.Light"> 
    <item name="android:startYear">1890</item> 
</style> 

내 경우에는 기본 시작 날짜는이 방법이 작동 나를 위해, 따라서 1900입니다.

희망이 도움이 될 것입니다!

+3

그냥 참고로, 이것은 "Unix Epoch"또는 "Unix Time"이라고 불리는데, 이것은 가능한 한 많이 사용하지 않으려 고하는 이유 중 하나입니다. 자세한 내용은 다음을 참조하십시오. http : //en.wikipedia .org/wiki/Unix_time –

+0

예를 들어 unixtime은 디바이스에서의 시간 표현 방법 인 경우가 많습니다. 특히 파일 수정 시간과 같은 "현재"날짜의 경우, 이는 자체 내부 표현이있는 DatePicker의 경우가 아니며, 이 소스별로 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/widget/DatePicker.java#DatePicker – esilver

+0

We 지금 당장이 해결책을 생각해 보면 시장이 어떻게 반응하는지 보게 될 것입니다. – greg7gkb

0

나는 이미 비슷한 시도 볼 수 있지만 다음과 같은 설정을 시도하십시오 DatePicker XML에 직접

android:startYear="1900" 

?

과 같이 :

<DatePicker 
      android:startYear="1900" 
      android:endYear="2100" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
></DatePicker> 

참조 : http://kevsaidwhat.blogspot.com/2011/10/fun-with-android-datepicker-and-1970.html

+0

우리는 DatePicker XML이 없습니다. DatePickerDialog가 동적으로 생성됩니다. DatePicker 자체는이 소스별로 DatePickerDialog에서 할당합니다. http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/app /DatePickerDialog.java?av=f – esilver

+0

docs에서 프로그래밍 방식으로 'startDate' 매개 변수를 설정하는 방법을 찾지 못했습니다. 죄송합니다 ... –

+0

DatePicker 소스의 다음 줄에 표시 : private static final int DEFAULT_START_YEAR = 1900; 프로그래밍 방식으로 설정하지 않아도되고 Droid x2에서 수행 할 수 있다는 사실은 버그가 있음을 나타냅니다. – esilver

0

이 질문은 조금 오래된이며,이 대답은 오래된 장치에 적용되지 않습니다,하지만 난 최근에 알게되었습니다했습니다 실현 새로운 장치 (Huawei Mediapad 7 Youth)에서이 문제를 해결 했으므로 새로운 정보로 업데이트하겠다고 생각했습니다.

API 11부터는이 작업을 수행하는 데 필요한 방법이 노출되어 있습니다. Calendar는 Unix Epoch를 0으로 사용할 수 있지만 Java (적어도 ~ JRE 8?까지)는 부호가있는 숫자를 사용하기 때문에 음수는 완전히 허용됩니다.

어떤 보고서가이 없다는 것을 것은 그래서 1888을 사용
// This is API 11! 
try { 
    // Hack to (try to) force minDate to 1888 instead of 1970. 
    DatePicker dp = dialog.getDatePicker(); 
    Calendar minCal = Calendar.getInstance(); 
    minCal.set(1888, Calendar.JANUARY, 1, 0, 0, 0); 
    dp.setMinDate(minCal.getTimeInMillis()); 

    if (maxDate > 0) 
     dp.setMaxDate(maxDate); 
} catch (NoSuchMethodError e) { 
    Log.w(TAG, "Can't set min/max dates: device/Android version is too old."); 
} 

최소 분명히 코드가 실행되고 무시되지 않았 음을 만들 것입니다 :이 코드는 잘 실행으로 다행히 당신은이 숙지 할 필요가 없습니다/재정의. 보고 된 장치에서이 작동 여부를 아직 듣지 못했습니다.

0

안녕하세요. 해결책을 찾았습니다. 당신은 setMinDate() 메소드에서 -ve 값을 설정할 수 있습니다.

dp.setMinDate(-1576800000000L);