2012-07-08 7 views
18

私のアプリケーションはAndroid 2.2エミュレータで完全に動作していました。私はその後、Android 4.1エミュレータでテストすることにしました。 DatePickerDialogはちょっと違っていて、何らかの理由で「完了」を押すと、onDateSet()リスナーが2回呼び出され、アプリケーションで問題が発生します。Android:Android 4.1エミュレータDatePickerダイアログから2回onDateSetを呼び出す

私は

mDateSetListener = new DatePickerDialog.OnDateSetListener() { 
    @Override 
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
      Log.v("onDateSet", "ENTERED"); 
      //rest of code... 
    }}; 

アンドロイド2.2日付ピッカー

Working Android 2.2 DatePicker

アンドロイド4.1日付ピッカー

"完了" をクリックしたときにコードに、以下に示すログが重複して印刷されているので、私はこれを知っています

Not Working Android 4.1 DatePicker

+3

エミュレータで同じ問題が発生しました2012年8月30日、ここに投票https://code.google.com/p/android/issues/detail?id=34860 – Moak

+0

[Jelly Bean DatePickerDialogの可能な複製---ありますキャンセルする方法?](http:// stackoverflow。com/questions/11444238/jelly-bean-datepickerdialog-there-a-way-to-cancel) –

答えて

24

ブール値を設定して、同じダイアログ内で二重発射をチェックしてみてください。

Calendar c = Calendar.getInstance(); 
c.add(Calendar.DAY_OF_YEAR, 1); 
final DatePickerDialog dateDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { 
    boolean fired = false; 
    public void onDateSet(final DatePicker view, final int year, final int monthOfYear, final int dayOfMonth) { 
     Log.i("PEW PEW", "Double fire check"); 
     if (fired) { 
      Log.i("PEW PEW", "Double fire occured. Silently-ish returning"); 
      return; 
     } else { 
      //first time fired 
      fired = true; 
     } 
     //Normal date picking logic goes here 
    } 
}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)); 
dateDialog.show(); 

この二重火災の問題もTimePickerDialogのonTimeSetで発生し、このチェックはまた、それらのために働く:に似た何か。私たちは与えられたビューisShown()かどうonDateSetの内側にチェックすると

+0

はい、うまくいくはずです。私は彼らがすぐにこの問題を解決することを望みます。 –

+1

'fired'変数を' false'にして、DatePickerが引き続き動作するようにします。ちなみに、問題はTimePickerダイアログでも発生します。 –

+0

この回避策の概念は、作成時に同様の「起動」チェックを使用して、TimePickerダイアログでも機能します。 – lodlock

0

これは関連していると思います。私は今日4.1でテストを開始し、いくつかのjavascriptイベントが2回発生するようです。ほとんどの場合、現在はクリックしてください。 奇妙なことに、私はアラートを追加すると「時には」一度だけ発生します。 動作に奇妙な不一致があります。

javascriptイベントは、このようにアンドロイド4.1で応答します。 iPhoneは、これまでに試したアンドロイドの以前のバージョン(4.0.xを含む)と同じように問題なく表示されます。

ブラウザやJavaScriptの処理方法に間違いがあるようですが、それはちょっと推測します。

+0

このエラーの解決方法はありますか?任意の回避策?:) –

+0

これまで何も見つかりませんでした。上記に加えて、それは単にクリックイベントまたはタッチイベントにあるようです。すべてのイベントではありません。 (私はしばらく時間がかかる)私はアンドロイドのバグリストのバグレポートを作成します。 – Dan

1

はAnkur Chaudharyさんの華麗なanswer同様のTimePickerDialog問題についてによると、それはピッカーを拡張するかのチェックを必要とせず、最小限の労力で全体の問題を解決しますただ、次の操作を行い、コードの周りに行く、あるいはOSのバージョンをチェックするいくつかの恐ろしいフラグ:

public void onDateSet(DatePicker view, int year, int month, int day) { 
    if (view.isShown()) { 
     // read the date here :) 
    } 
} 

そしてもちろん同じことが繰り返しにはAnkurの答え

0

ごとにonTimeSetのために行うことができます。ティsはAndroidで確認されたバグです。 2つの回避策が既に提案されており、(インスタンス)変数に状態を保存するか、isShown()の場合はダイアログに尋ねます。しかしisShown()は信頼できないようです(例えばthis answer's commentsによる)、ダイアログを再表示したい場合は状態を保存するのが面倒になります。
よりよい解決策は、ダイアログ自体の内部状態を保存することです:

public void onDateSet(DatePicker picker, int year, int monthOfYear, int dayOfMonth) { 
    if (picker.getTag() == null) { 
     picker.setTag("TAGGED"); 
     // Only gets called once per Dialog 
    } 
} 

それはきれいで、効果的です。