web-dev-qa-db-ja.com

Android onClick関数で遅延を設定する方法

)記憶ゲームを作成中です。私の問題は、2回目にクリックするたびに、トグルボタンが表示されないことです。明確にするために-最初にクリックするとトグルボタンが切り替わり、保持している数字が表示されます。別のトグルボタンを2回クリックすると、トグルボタンが表示され、数字が表示されます。同じ、またはそれらが異なる場合は、元に戻す。

以下はonClick関数として使用するコードです。2番目の「ifブロック」のどこかに何らかのスリープ関数または遅延関数を置くことを考えています-(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;

            }
        }

    }

}

}

19
Piotrgo

Onclickでスリープする代わりに、遅延メッセージを(関連する実行可能ファイルとともに)ハンドラーに投稿し、UIを更新させることができます。明らかにこれをアプリの設計に合わせて機能させますが、基本的な考え方は次のとおりです。

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

次に、onClickから、遅延メッセージをハンドラーに投稿し、実行する実行可能ファイルを指定します。

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

ゲームの複雑さにもよりますが、これはあなたが望むものではないかもしれませんが、それはあなたにスタートを与えるはずです。

51
Ryan Reeves

正しく動作します:

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

UIスレッドでスリープしないでください(デフォルトでは、すべてのコードはUIスレッドで実行されます)-UIがフリーズするだけで、変更や終了はできません。コードロジックが理解できないため、これ以上提案することはできません。

2
Andrey Novikov

not UIスレッドでスリープします。 UIスレッドから "wake up and wait"メッセージを探す別のスレッドが必要です。その2番目のスレッドは、通常のスリープ呼び出しの後に隠れることができます。次に、何かを非表示にする必要があるときにスレッドを保持したり、別の遅延が必要になるたびにスレッドを削除して新しいスレッドを作成したりできます。

このコンテキスト(UIスレッドの外部からUIイベントをトリガーする)で役立つ可能性のある「postFoo」関数があると思います。

2
Mark Storer
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);


    }
});
1
Anand Mohan