2011-12-23 26 views
9

DatePickerDialogで1970年1月1日より前に日付を設定できないという報告があります。この問題は私たちのために再版されていません。DatePickerDialogが1970年1月1日の最小日付を間違って適用しています

私はすでに、DatePickerDialogが基礎となるDatePickerのsetMinDate/setMaxDate関数を公開していないことを認識しています。そのため、ハンドセットメーカー固有の変更がminDate/maxDateに影響しているようです。

このユーザーは、彼がDroid x2をVerizon 2.2 for Froyoを実行していると報告しています。彼はデバイスモデルの記述が正しいと信じていますが、多くのユーザーはOSのバージョンについて混乱しているので、2.3を実行している可能性があります。

私は私の活動にこのテーマを追加することによってこの問題を解決しようと試み:

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

私の活動でこのテーマは私のテストデバイス上DatePickerDialogを拘束する意図した効果(ギャラクシータブとオリジナルを持っていますがモトローラドロイド)、それは明らかにユーザーのための効果がありませんでした。

この問題は、ユーザーの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); 

を私は自分のアプリケーションのためのカスタムテーマを宣言 - 私は、アプリケーションのために同じテーマをしたいです。ところで、あなたは活動のために同じことをすることができます。

<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年です。

これがあなたを手伝ってくれることを願っています!

+3

参考までに、これは「Unix Epoch」または「Unix Time」と呼ばれるものであり、これを可能な限り使用しないようにする理由の1つにすぎません。詳細はhttp://en.wikipediaを参照してください。 .org/wiki/Unix_time –

+0

yesの間、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

ドキュメントで、プログラムでstartDateパラメータを設定する方法が見つからないようです... –

+0

DatePickerソースのこれらの行に: private static final int DEFAULT_START_YEAR = 1900; プログラムで設定する必要はありません。ドロイドx2がそうすることができたということは、どこかにバグがあることを示しています。 – esilver

0

私はこの質問は少し古いですが、この答えは古いデバイスには適用されませんことを認識し、私は最近の認識されてきましたこの新しいデバイス(華為Mediapad 7青年)上の問題なので、私は新しい情報でこれを更新したい考え出し:

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

こんにちは、私はそれのための解決策を見つけました。あなたはsetMinDate()メソッドで-veの値を設定することができ、それは私のために働く。

dp.setMinDate(-1576800000000L); 
関連する問題