2015-08-06 3 views
-3

Когда вызывается showTimeDialog(), диалог появляется дважды. Когда я нажимаю «ОК», появляется еще один диалог.AlertDialog появляется дважды

public void showTimeDialog(){ 
    final TimePicker timePicker = new TimePicker(this); 
    timePicker.setIs24HourView(true); 
    timePicker.setCurrentHour(20); 
    timePicker.setCurrentMinute(15); 

    timeDialog=new AlertDialog.Builder(this) 
    .setTitle("Test") 
    .setPositiveButton(android.R.string.ok, new OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Log.d("Picker", timePicker.getCurrentHour() + ":" 
        + timePicker.getCurrentMinute()); 
      dialog.dismiss(); 
     } 
    }) 
    .setNegativeButton(android.R.string.cancel, 
      new OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, 
         int which) { 
        Log.d("Picker", "Cancelled!"); 
        dialog.dismiss(); 
       } 
      }).setView(timePicker).show(); 
} 

В onCreate(), у меня есть:

 editText_time.setOnTouchListener(new View.OnTouchListener() { 
     public boolean onTouch(View arg0, MotionEvent arg1) { 
      showTimeDialog(); 
      return false; 
     } 
    }); 
+1

Я не уверен, о downvotes или почему люди хотя бы не комментируя, но я думаю, также предоставить код, который призывающую 'showTimeDialog()'. Кроме того, объясните, что вы пробовали до сих пор с точки зрения отладки, чтобы мы могли помочь дальше. – WOUNDEDStevenJones

+1

1. Зачем вы отправляете код внутри функции, когда вы говорите, что его вызывали дважды? Как вы думаете, насколько это полезно? 2. «Почему это происходит» не полезно для других людей. –

+0

Мой плохой! Пожалуйста, отметьте сейчас –

ответ

2

Это похоже на код, который вы вызываете showTimeDialog() метод вы ожидаете, что не вернется, если диалог не будет отклонено. Если это так (ваш вопрос не является полным, поэтому я частично угадываю), то это неправильно, поскольку диалоги асинхронны.

EDIT

Он отлично работает, как ваш диалог вызывается дважды. Это потому, что вы делаете это в onTouch(), затем начинается первый диалог, затем вы касаетесь экрана (поскольку это вызывает событие касания ACTION_DOWN), а затем вы отпускаете палец, который вызывает ACTION_UP. Чтобы избежать этого, вы можете добавить условие в код, и я предложил бы реагировать на ACTION_UP, как это:

public boolean onTouch(View v, MotionEvent event) { 
    if (event.getActionMasked() == MotionEvent.ACTION_UP) { 
     showTimeDialog(); 
    } 
} 
+0

Я вижу. Добавлен код, вызывающий метод showTimeDialog. Пожалуйста, проверьте –

+0

см. Отредактированный ответ –

+0

Спасибо :) В этом была проблема –

1

Вы уверены, что это вызывается только один раз? Вы сделали вывод журнала? Я предполагаю, что, поскольку вы вызываете метод в onTouch, метод вызывается больше раз, чем вы думаете.

onTouch(View, MotionEvent) не только вызывается, когда вид коснулся. Существует несколько раз, когда он вызывается одним нажатием, и вы можете проверить документы MotionEvent, чтобы увидеть все возможные действия, которые вызывают этот метод.

Вероятно, что происходит метод showTimeDialog() в настоящее время открыт, когда происходит ACTION_DOWN события, а затем снова, когда ACTION_UP или ACTION_CANCEL событие происходит потому, что ваш диалог теперь блокирует вид. Попробуйте изменить метод onTouch следующим образом:

public boolean onTouch(View arg0, MotionEvent arg1) { 
    if (arg1.getActionMasked() == MotionEvent.ACTION_UP) 
     showTimeDialog(); 
    return false; 
} 
+0

Спасибо большое. Так оно и было. –

Смежные вопросы