27

今日、私は を使用しようとしていましたTimePickerDialogが、いくつかの欠陥に気付きました。

  1. OnTimeSet は、ダイアログが閉じられたときにも呼び出されます (たとえば、外側をクリックすることによって)。
  2. ユーザーが「完了」ボタンをタップすると、OnTimeSet が 2 回呼び出されます。

私が使用している API は 18 です。

他の誰かがこれらの問題を経験しましたか? それらをどのように解決しましたか?

4

5 に答える 5

36

View クラスの既に指定されたメソッドを使用する必要があります。

new TimePickerDialog.OnTimeSetListener() {
    @Override
    public void onTimeSet(TimePicker view, int hour, int minute) {  
        if (view.isShown()) {
            // This method will return true only once...
        }
    }
};
于 2014-09-25T08:35:53.637 に答える
16

今日、まったく同じ問題に直面しました。なぜこれが起こったのか理解できませんでしたが、簡単な解決策を見つけました:

メソッド onTimeSet() は、ダイアログが閉じられたときに 1 回呼び出され、[完了] ボタンがクリックされたときに 2 回呼び出されます。いずれにせよ、onTimeSet() への不要な呼び出しが 1 つあります。そのため、最初の呼び出しは常に無視することにしました。

コードは次のとおりです。

Calendar mcurrentTime = Calendar.getInstance();
int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
int minute = mcurrentTime.get(Calendar.MINUTE);

TimePickerDialog mTimePicker;
mTimePicker = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() 
    {
        int callCount = 0;   //To track number of calls to onTimeSet()

        @Override
        public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) 
        {
             if(callCount == 1)    // On second call
             {
                 timeString = selectedHour + ":" + selectedMinute + ":00";
                 Log.d("TEST", "Chosen time : "+ timeString);           
             }

             callCount++;    // Incrementing call count.

        }
    }, hour, minute, true);

    mTimePicker.setTitle("Pick Time");
    mTimePicker.show();
于 2013-12-12T12:09:47.853 に答える
5

繰り返しますが、これは Android で確認された複数のダイアログ タイプのバグです。状態を (インスタンス) 変数に保存するか、状態を Dialog に確認するかの 2 つの回避策が既に提案されていますisShown()。しかしisShown()、Android 4.0.4 では信頼性がないようで、ダイアログを再表示したい場合、状態の保存が面倒になります。
メソッドを呼び出すのは同じインスタンスであるため、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:32:57.180 に答える
2

count を使用してそれを回避します。TimePickDialog が 2 回以上選択された場合も、うまく機能するはずです。

            TimePickerDialog tpd = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
            int count = 0;
            @Override
            public void onTimeSet(TimePicker view, int setHour, int setMinute) {
                if(count % 2 == 0) {
                   //set time here
                }
                count++;

            } }, hour, minute, true);
于 2014-05-21T03:20:42.520 に答える