Как установить задержку в функции 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;
}
}
}
}
}
Ответы
Ответ 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);
}
});