19

私のアプリケーションは、Android 2.2 エミュレーターで完全に動作していました。次に、Android 4.1 エミュレーターでテストすることにしました。見た目が少し異なり、DatePickerDialog何らかの理由で「完了」を押すと、onDateSet()リスナーが 2 回呼び出され、アプリケーションで問題が発生します。

「完了」をクリックするたびに、コードの下に示されているログが2回出力されるため、これを知っています

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

Android 2.2 日付ピッカー

作業中の Android 2.2 DatePicker

Android 4.1 日付ピッカー

Android 4.1 の DatePicker が機能しない

4

4 に答える 4

25

同じダイアログ内でダブルファイアをチェックするようにブール値を設定してみてください。次のようなもの:

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 でも発生し、このチェックはそれらに対しても機能します。

于 2012-07-31T20:12:13.603 に答える
0

繰り返しますが、これは Android で確認されているバグです。状態を (インスタンス) 変数に保存するか、状態を Dialog に確認するかの 2 つの回避策が既に提案されていますisShown()。しかしisShown()、信頼性がないように思われ(たとえば、この回答のコメントによると)、ダイアログを再表示する場合、状態の保存が面倒になります。
より良い解決策は、Dialog 自体の内部に状態を保存することです。

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

クリーンで効果的です。

于 2015-04-29T13:29:00.163 に答える
0

これは関連していると思います。今日 4.1 でテストを開始したところ、いくつかの JavaScript イベントが 2 回発生するように見えることがわかりました。今のところクリックが多いです。奇妙なことに、アラートを追加すると、「時々」1回起動します。挙動は奇妙に一貫性がありません。

JavaScript イベントは、Android 4.1 でのみこの方法で応答します。iPhoneは、これまでに試したすべての以前のバージョンのAndroid(4.0.xを含む)と同様に問題ないようです。

ブラウザまたはJavaScriptの処理方法にエラーがあるように思えますが、それは単なる推測です。

于 2012-07-13T11:43:47.267 に答える