DatePickerDialog неправильно применяет минимальную дату 1 января 1970 г. - PullRequest
9 голосов
/ 24 декабря 2011

У нас есть участник, сообщающий, что он не может установить дату до 1 января 1970 года в нашем DatePickerDialog. Этот вопрос не воспроизводится для нас.

Мне уже известно, что DatePickerDialog не предоставляет функции setMinDate / setMaxDate базового DatePicker, поэтому может показаться, что какая-то конкретная модификация производителя трубки влияет на minDate / maxDate.

Этот пользователь сообщает, что он работает под управлением Droid x2 на Verizon под управлением 2.2 Froyo. Хотя мы считаем, что он прав в описании своей модели устройства, многие пользователи не уверены в версии ОС, поэтому он может работать под управлением 2.3.

Я попытался решить эту проблему, добавив эту тему в свою активность:

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

Несмотря на то, что эта тема в моей деятельности имела намеренный эффект ограничения DatePickerDialog на моих тестовых устройствах (вкладка Galaxy и оригинальный Motorola Droid), она, очевидно, не имела никакого эффекта для пользователя.

Эта проблема повторяется для нашего пользователя 100% времени, но у нас работает правильно на наших устройствах.

Может кто-нибудь объяснить, что может быть причиной этого и как мы могли бы это исправить?

Я подал эту ошибку против Google по этому вопросу.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 24 декабря 2011

Дата запуска устройств Android начинается с 1 января 1970 года. Возможно, это может быть ваш случай. Android рассчитывает время как количество миллисекунд, прошедших с 1 января 1970 года.

Я нашел что-то вроде хака для вашего дела. Здесь я создаю динамически 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 голос
/ 24 сентября 2014

Привет, я нашел решение для этого.Вы можете установить значение -ve в методе setMinDate (), и это работает для меня.

dp.setMinDate(-1576800000000L);
1 голос
/ 23 мая 2014

Я понимаю, что этот вопрос немного стар, и что этот ответ не будет применяться к более старым устройствам, но недавно я узнал об этой проблеме на более новом устройстве ( 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, так что любые отчеты, утверждающие, что это минимум, проясняют, что код был выполнен, а не проигнорирован / переопределен. Должен отметить, что я еще не слышал, работает ли это на указанном устройстве.

0 голосов
/ 24 декабря 2011

Я вижу, вы уже пробовали нечто подобное, но пытались ли вы установить следующее:

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

...