3

このコードを使用してImageViewでのマルチクリックを防止しようとしましたが、役に立ちません。

    Boolean isClicked = false;
    @Override
    public void onClick(View v)
    {
        if (v == imgClick && !isClicked)
        {
                      //lock the image
            isClicked = true;
            Log.d(TAG, "button click");

            try
            {
                //I try to do some thing and then release the image view
                Thread.sleep(2000);
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            isClicked = false;
        }

    }

ログキャットでは、ImageViewをできるだけ速く5回クリックすると、5行の「ボタンクリック」が表示されます。log catが最初の行を印刷し、しばらく(2秒)待ってから次の行を印刷するのを見ることができます。
ImageViewをクリックすると、発生したイベントが順番にキューに移動すると思いますね。では、どうすればそれを止めることができますか?isClicked変数の代わりにsetEnable()またはsetClickable()
も使用しようとしましたが、機能しません。

4

2 に答える 2

3

この動作するコードを試してみてください

    Boolean canClick = true; //make global variable
   Handler  myHandler = new Handler();

@Override
public void onClick(View v)
{
    if (canClick)
    {

       canClick= false;   //lock the image
       myHandler.postDelayed(mMyRunnable, 2000);

       //perform  your action here

    }

}

/* give some delay..*/
    private Runnable mMyRunnable = new Runnable()
    {
        @Override
        public void run()
        {   

         canClick = true;
         myHandler.removeMessages(0);
        }
     };


Instead of sleeping in 2 seconds, I use some task like doSomeThing() method (has accessed UI thread), and I don't know when it completed. So how can I try your way?

//このAndroid リンクを参照しました。スレッドをより効率的に処理できますが、以下のコードが機能することを願っています。//これを試して

 Boolean canClick = true; //make global variable
public void onClick(View v) {
        if(canClick){

          new DownloadImageTask().execute();
        }
    }

        private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {


            protected Bitmap doInBackground(String... urls) {
                 Log.d("MSG","Clicked");
                 canClick =false;
                 //perform your long operation here

                return null;
             }

             protected void onPostExecute(Bitmap result) {
                 canClick =true;
             }
         }
于 2012-05-17T03:34:54.260 に答える
1

あなたはあなたの最後に消費されたクリックを追跡しView、それに基づいて必要なアクションを実行するか、単に戻ることができます:

private long calcTime;
private boolean isClickedLately(final long millisToWait)
{
    if (System.currentTimeMillis() - calcTime < millisToWait)
        return true;
    return false;
}

@Override
public void onClick(View v)
{
    if (isClickedLately(2000))
        return;
    calcTime = System.currentTimeMillis();
    Log.d(TAG, "consuming button click");
    // perform the necessary actions
}

このmillisToWaitパラメーターを使用すると、「待機中」のしきい値を調整できますが、2回の連続クリックの間に正確に2秒間待機することがわかっている場合は、それを削除できます。

このように対処する必要はありませんThreads。これは、GUIスレッドを待機させるのは良い考えではないためです。

于 2012-05-17T03:38:44.213 に答える