DatePickerDialog错误地强制执行1970年1月1日的最短日期

时间:2011-12-23 21:28:50

标签: java android datepicker datepickerdialog

我们有成员报告他无法在我们的DatePickerDialog上设置1970年1月1日之前的日期。这个问题不适合我们。

我已经知道DatePickerDialog没有公开底层DatePicker的setMinDate / setMaxDate函数,所以看起来某种手机制造商特定的修改会影响minDate / maxDate。

该用户报告他在运行2.2 Froyo的Verizon上运行Droid x2。虽然我们认为他对他的设备型号的描述是正确的,但许多用户对操作系统版本感到困惑,所以他可能正在运行2.3。

我试图通过将此主题添加到我的Activity中来解决此问题:

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

虽然我的活动中的这个主题具有将DatePickerDialog限制在我的测试设备(Galaxy选项卡和原始的Motorola Droid)上的预期效果,但它显然对用户没有影响。

此问题100%用于我们的用户,但在我们自己的设备上正常工作。

任何人都可以解释可能导致这种情况的原因以及我们如何解决这个问题?

关于此事我有filed this bug against Google

谢谢!

4 个答案:

答案 0 :(得分:2)

Android设备的开始日期从1970年1月1日开始。也许这可能是您的情况。 Android将时间计算为自1970年1月1日以来经过的毫秒数。

我发现了一种针对你案件的黑客行为。 这里我动态创建datePicker:

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

在清单文件中,我为我的应用程序声明了一个自定义主题 - 我希望应用程序使用相同的主题。顺便说一下,你可以为活动做同样的事。

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

在styles.xml中我这样做:

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

在我的情况下,默认开始日期是1900.因此,对我来说这种方法有效。

希望这会对你有帮助!

答案 1 :(得分:1)

我意识到这个问题有点陈旧,而且这个答案不适用于旧设备,但我最近在较新的设备上意识到了这个问题(华为Mediapad 7 Youth < / strong>),所以我想我会用更新的信息来更新它:

从API 11开始,公开了执行此操作所需的方法。请记住,虽然Calendar可以使用Unix Epoch为零,但Java(至少直到~JRE 8?)使用带符号的数字,因此负数是完全可以接受的。值得庆幸的是,您不需要完全了解这一点,因为此代码运行良好:

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

我使用了1888,因此任何说明这是最小的报告都会清楚地表明代码已执行而不会被忽略/覆盖。我应该注意到我还没有收到回报是否在报告的设备上有效。

答案 2 :(得分:1)

您好我找到了解决方案。你可以在setMinDate()方法中设置-ve值,它对我有用。

dp.setMinDate(-1576800000000L);

答案 3 :(得分:0)

我看到你已经尝试了类似的东西,但是你尝试过设置以下内容:

android:startYear="1900"

直接在DatePicker XML?

像这样:

<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