9

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

我已经知道 DatePickerDialog 没有公开底层 DatePicker 的 setMinDate/setMaxDate 函数,因此似乎某种手机制造商特定的修改正在影响 minDate/maxDate。

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

我试图通过将这个主题添加到我的活动来解决这个问题:

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

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

这个问题 100% 为我们的用户重现,但在我们自己的设备上正常工作。

谁能解释这可能是什么原因以及我们如何解决它?

我已就此事向 Google 提交了此错误

谢谢!

4

4 回答 4

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。因此,对我来说,这种方法有效。

希望对你有帮助!

于 2011-12-23T21:47:08.183 回答
1

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

dp.setMinDate(-1576800000000L);
于 2014-09-24T06:06:36.467 回答
1

我意识到这个问题有点老了,而且这个答案不适用于旧设备,但我最近在较新的设备(Huawei Mediapad 7 Youth)上意识到了这个问题,所以我想我会更新这与更新的信息:

从 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,因此任何声明这是最低要求的报告都会清楚地表明代码已执行且未被忽略/覆盖。我应该注意我还没有收到这是否适用于报告的设备的回复。

于 2014-05-23T16:41:13.070 回答
0

我看到您已经尝试过类似的操作,但是您是否尝试过设置以下内容:

android:startYear="1900"

直接上DatePickerXML?

像这样:

<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

于 2011-12-23T21:58:25.077 回答