下面的代码应该显示一个对话框,然后根据程序的状态,通过单击OK取消对话框时执行一些动画(通过调用doseDownCourt()
执行)。
问题在于,当关闭时,对话框不会立即消失 - 它会停留在屏幕上,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();
答案 0 :(得分:1)
首先,您不必在onClickListener中关闭警报对话框,因为默认情况下它将被关闭。
其次,尝试在后台线程中运行drawAll和doseDownCourt函数,并使用Handler更新用户界面。
请查看以下文档:
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();
}
但要小心,因为你可能在这两个函数中做的一些事情需要在UiThread上运行,在这种情况下你应该使用某种Handler。
罗尔夫