0

doseDownCourt()以下のコードは、ダイアログボックスを表示し、プログラムの状態に応じて、 [OK]をクリックしてダイアログボックスが閉じられたときに アニメーションを実行する(toの呼び出しによって実行される)ことを想定しています。

問題は、ダイアログボックスを閉じてもすぐに消えないことです。アニメーションの実行中および表示中は、[OK]ボタンが「押された」状態(青色の網掛け)で画面に表示されたままになります。ダイアログボックスは、アニメーションが完了するまで画面に表示されたままになります。

コマンドが実行される順序を変更しようとしました。また、スレッドを使用して、ダイアログボックスが表示される前にアニメーションが消えるのを待たせようとしましたが、希望する動作を得ることができませんでした。

任意の提案をいただければ幸いです。ありがとう。

    AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext());       
    String message;
    Drawable puffle;
    Drawable dr;
    if (made == true) {
        message = "You made it!!!";
         dr = getResources().getDrawable(R.drawable.puff_happy);
    }
    else {
        message = "Aw, you missed. Better luck after your next dose!";
        dr = getResources().getDrawable(R.drawable.puff_confused);
    }
    builder.setMessage(message);        
    Bitmap bitmap = ((BitmapDrawable) dr).getBitmap();
    puffle = new BitmapDrawable(Bitmap.createScaledBitmap(bitmap, 200, 200, true));
    builder.setTitle(" ");
    builder.setIcon(puffle);
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {    
            alertDialog.dismiss();
            drawAll();      //put ball and shadow back with avatar
            doseDownCourt();    //call doseDownCourt in case multiple doses have been taken before a shot for each has been attempted               
        }
    });
    alertDialog = builder.create();
    alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    WindowManager.LayoutParams WMLP = alertDialog.getWindow().getAttributes();
    WMLP.y = -300;   //y position of dialog box
    alertDialog.getWindow().setAttributes(WMLP);
    alertDialog.show();
4

1 に答える 1

1

まず、onClickListenerのアラートダイアログはデフォルトで閉じられるため、閉じる必要はありません。

次に、バックグラウンドスレッドでdrawAll関数とdoseDownCourt関数を実行し、ハンドラーを使用してユーザーインターフェイスを更新してみます。

次のドキュメントをご覧ください。

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable

http://developer.android.com/guide/components/processes-and-threads.html

http://developer.android.com/reference/android/os/Handler.html

したがって、onClickはメインスレッドで実行されるため、現在のようにメインスレッドで多くの時間がかかるプロセスを実行しないでください。

編集:ドキュメントから

このコードは、onClick関数でスレッドを使用する方法を示しています

public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            Bitmap b = loadImageFromNetwork("http://example.com/image.png");
            mImageView.setImageBitmap(b);
        }
    }).start();
}

あなたの場合、コードを次のように変更します。

public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            drawAll();
            doseDownCourt();
        }
    }).start();
}

ただし、これら2つの関数で実行する可能性のあるいくつかのことはUiThreadで実行する必要があるため、注意してください。その場合は、何らかのハンドラーを使用する必要があります。

ロルフ

于 2012-09-26T17:57:32.030 に答える