2011-12-23 42 views
9

Chúng tôi có một thành viên báo cáo rằng anh ấy không thể đặt ngày trước ngày 1 tháng 1 năm 1970 trên DatePickerDialog của chúng tôi. Vấn đề này không repro cho chúng tôi.DatePickerDialog thực thi không đúng ngày tối thiểu là ngày 1 tháng 1 năm 1970

Tôi đã biết rằng DatePickerDialog không hiển thị các hàm setMinDate/setMaxDate của DatePicker bên dưới, do đó, có vẻ như một số sửa đổi cụ thể của nhà sản xuất thiết bị cầm tay đang ảnh hưởng đến minDate/maxDate.

Người dùng này báo cáo rằng anh đang chạy Droid x2 trên Verizon chạy 2,2 Froyo. Trong khi chúng tôi tin rằng anh ấy là chính xác trong mô tả của mình về mô hình thiết bị của mình, nhiều người dùng đã nhầm lẫn về phiên bản hệ điều hành, vì vậy anh ấy có thể đang chạy 2.3.

Tôi đã cố gắng để giải quyết vấn đề này bằng cách thêm chủ đề này để Hoạt động của tôi:

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

Trong khi chủ đề này trên hoạt động của tôi có tác dụng dự định của kìm hãm sự DatePickerDialog trên các thiết bị thử nghiệm của tôi (một tab Galaxy và một bản gốc Motorola Droid), nó dường như không có hiệu lực cho người dùng.

Sự cố này repros cho người dùng của chúng tôi 100% thời gian, nhưng hoạt động chính xác cho chúng tôi trên thiết bị của chính chúng tôi.

Có ai có thể giải thích điều gì có thể gây ra điều này và cách chúng tôi có thể khắc phục sự cố không?

Tôi có filed this bug against Google về vấn đề này.

Cảm ơn!

+0

Vấn đề tương tự đang được báo cáo bởi một vài người dùng của chúng tôi (bao gồm cả người dùng Droid x2) và chúng tôi cũng không thể kiểm soát nội bộ. – greg7gkb

+0

Cũng repros trên Motorola Razr – HannahMitt

+0

Bất cứ ai cũng có thông tin cập nhật về điều này? Chúng tôi vẫn nhận được báo cáo về nó trong lĩnh vực này ... không có quyền truy cập vào Razr một cách không may: ( – greg7gkb

Trả lời

2

Ngày bắt đầu thiết bị Android bắt đầu từ ngày 1 tháng 1 năm 1970. Có thể điều này có thể là trường hợp của bạn. Android tính thời gian là một phần nghìn giây trôi qua kể từ ngày 1 tháng 1 năm 1970.

Tôi đã tìm thấy một loại hack cho trường hợp của bạn. Ở đây tôi tạo động datepicker:

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

Trong file manifest Tôi tuyên bố một chủ đề tùy chỉnh cho ứng dụng của tôi - Tôi muốn cùng một chủ đề cho ứng dụng. Bằng cách này bạn có thể làm tương tự cho hoạt động.

<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> 

Trong một styles.xml Tôi làm điều này:

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

Ngày bắt đầu mặc định trong trường hợp của tôi là 1900. Như vậy, đối với tôi làm việc cách tiếp cận này.

Hy vọng điều này sẽ giúp bạn!

+3

để tham khảo, đây là những gì được gọi là "Unix Epoch" hoặc "Thời gian Unix", và đây chỉ là một trong những lý do tại sao tôi cố gắng tránh sử dụng nó càng nhiều càng tốt. .org/wiki/Unix_time –

+0

Trong khi có, unixtime thường là phương thức đại diện thời gian trên các thiết bị, đặc biệt là đối với các ngày "hiện tại" (như thời gian sửa đổi tệp), đó không phải là trường hợp của DatePicker. theo nguồn này tại đây: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/widget/DatePicker.java#DatePicker – esilver

+0

Chúng tôi đã đi với giải pháp này cho đến bây giờ, sẽ thấy cách thị trường phản ứng :) – greg7gkb

0

Tôi thấy bạn đã cố gắng một cái gì đó tương tự, nhưng bạn đã cố gắng thiết lập như sau:

android:startYear="1900" 

trực tiếp trên DatePicker XML?

Giống như vậy:

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

tham khảo: http://kevsaidwhat.blogspot.com/2011/10/fun-with-android-datepicker-and-1970.html

+0

Chúng tôi không có bất kỳ XML DatePicker nào. DatePickerDialog được tạo động. DatePicker được phân bổ bởi DatePickerDialog theo nguồn này tại đây: 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

Tôi không thể tìm thấy trong tài liệu một cách để lập trình tham số 'startDate', xin lỗi ... –

+0

Mỗi dòng này trong nguồn DatePicker: riêng cuối cùng tĩnh int DEFAULT_START_YEAR = 1900; Tôi không cần phải lập trình thiết lập nó, và thực tế là Droid x2 đã có thể làm như vậy chỉ ra có một lỗi nào đó .... – esilver

0

Tôi nhận ra câu hỏi này là một ít tuổi, và rằng câu trả lời này sẽ không áp dụng cho các thiết bị cũ, nhưng tôi vừa mới được thực hiện nhận thức vấn đề này trên một thiết bị mới hơn (Huawei Mediapad 7 thanh niên), vì vậy tôi figured tôi muốn cập nhật này với thông tin mới hơn:

Bắt đầu với API 11, phương pháp cần thiết để làm điều này được tiếp xúc. Hãy nhớ rằng, trong khi Lịch có thể sử dụng Unix Epoch là số không, Java (ít nhất là cho đến khi ~ JRE 8?) Sử dụng các số đã ký, vì vậy âm bản hoàn toàn có thể chấp nhận được. Rất may bạn không cần phải được nhận thức đầy đủ này, như mã này chạy tốt:

// 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."); 
} 

tôi đã sử dụng 1888 để cho bất kỳ báo cáo nêu đây là tối thiểu sẽ làm cho nó rõ ràng rằng mã đã được thực hiện và không được bỏ qua/ghi đè. Tôi nên lưu ý rằng tôi chưa nghe thấy liệu tác phẩm này có hoạt động trên thiết bị được báo cáo hay không.

0

Xin chào, tôi đã tìm thấy giải pháp cho nó. bạn có thể đặt giá trị -ve trong phương thức setMinDate() và nó hoạt động cho tôi.

dp.setMinDate(-1576800000000L); 
Các vấn đề liên quan