Подтвердить что ты не робот

Как установить задержку в функции Android onClick

) Я занимаюсь созданием игры с памятью. Моя проблема в том, что всякий раз, когда я нажимаю второй раз, я даже не могу видеть кнопку с кнопками. Чтобы быть ясным - первый щелчок переключает переключатель, так что я могу увидеть номер, который он удерживает, второй щелчок на другом переключателе переключается, чтобы переключить его, покажите мне номер, а затем перейдите к тому, чтобы либо установить оценку +1, если числа являются то же самое, или отменить их обратно, если они разные.

Ниже приведен код, который я использую как мою функцию onClick, я думал о том, чтобы помещать какую-то функцию сна или задержки где-то во втором "if block" - (if (klikniecia == 2)).

Любая помощь по этой теме будет оценена.

public void onClick(View view) {
for (int i = 0; i < karta.length; i++){
    if (view == karta[i]){
        karta[i].setEnabled(false);
        klikniecia++;
        if (klikniecia == 1){
            kartaID[0]=i;
            kartaWartosc[0]=listaKart.get(i);

        }
        if (klikniecia == 2){
            kartaID[1]=i;
            kartaWartosc[1]=listaKart.get(i);

            //i think, about setting a delay here, so i can see both of the cards, regardles if the're the same or not before reverting them.

            if (czyPara()){
                karta[kartaID[0]].setEnabled(false);
                karta[kartaID[1]].setEnabled(false);
                klikniecia=0;
            }
            else{

                karta[kartaID[0]].setEnabled(true);
                karta[kartaID[0]].toggle();
                karta[kartaID[1]].setEnabled(true);
                karta[kartaID[1]].toggle();
                klikniecia=0;

            }
        }

    }

}

}

4b9b3361

Ответ 1

Вместо того, чтобы спать в onclick, вы можете отправить сообщение с задержкой обработчику (с соответствующим runnable) и обновить интерфейс. Очевидно, вписывается это в дизайн вашего приложения и заставляет его работать, но основная идея такова:

//Here a runnable/handler combo
private Runnable mMyRunnable = new Runnable()
{
    @Override
    public void run()
    {
       //Change state here
    }
 };

Затем из onClick вы отправляете сообщение с задержкой в ​​обработчик, указав, что runnable будет выполнен.

Handler myHandler = new Handler();
myHandler.postDelayed(mMyRunnable, 1000);//Message will be delivered in 1 second.

В зависимости от того, насколько сложна ваша игра, это может быть не совсем то, что вы хотите, но это должно дать вам начало.

Ответ 2

Правильно работайте:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 100ms
  }
}, 100);

Ответ 3

Вы никогда не должны спать в потоке пользовательского интерфейса (по умолчанию весь ваш код работает в потоке пользовательского интерфейса) - он только заставит замораживать пользовательский интерфейс, не позволяя чему-либо изменять или заканчивать. Я не могу предложить больше, потому что я не понимаю логику кода.

Ответ 4

Не спать в потоке пользовательского интерфейса. Вам понадобится другой поток, который будет искать сообщение "просыпаться и ждать" из вашего потока пользовательского интерфейса. Затем этот второй поток мог скрыться после обычного сна. Затем вы могли бы поддерживать поток в следующий раз, когда вам нужно что-то скрывать, или убить его, и нагнетать новый каждый раз, когда вам понадобится другая задержка.

Я считаю, что есть некоторые функции "postFoo", которые могут быть полезны в этом контексте (запуск событий пользовательского интерфейса из-за потока пользовательского интерфейса).

Ответ 5

b.setOnClickListener(new OnClickListener() {

    public void onClick(View arg0) {
        // TODO Auto-generated method stub

        final ProgressDialog myPd_ring=ProgressDialog.show(MainActivity.this, "confident checker", "calculating please wait..", true);
        myPd_ring.setCancelable(true);
        new Thread(new Runnable() {  
              public void run() {
                    // TODO Auto-generated method stub


                    try
                    {
                          Thread.sleep(5000);


                    }
                    catch(Exception e){}
                    b.dismiss();
              }
        }).start();


        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
          public void run() {
              Toast.makeText(getApplicationContext(), "today your confident level is 90% ",
                        Toast.LENGTH_LONG).show();

          }
        }, 5000);


    }
});