2012-09-26 34 views
0

下面的代码应该显示一个对话框,然后根据程序状态执行一些动画(通过调用doseDownCourt()执行),通过单击确定取消对话框时。AlertDialog在屏幕上持续太长

问题在于,当解除对话框时,对话框不会立即消失 - 当动画正在执行并显示时,它将保持在屏幕上,并且“确定”按钮处于“按下”状态(阴影蓝色) 。对话框保持在屏幕上,直到动画完成。

我试图改变执行命令的顺序,也尝试使用线程使动画等待对话框在开始之前消失,但一直未能获得行为我想要。

任何建议,将不胜感激。谢谢。

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(); 

回答

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上运行,在这种情况下,您应该一些处理程序。

罗尔夫

+0

罗尔夫,我想你的代码,它似乎是在做的伎俩,但我得给它一些更没想明白究竟它在做什么,也弄清楚我是否需​​要Handler,如你所说。非常感谢! – hBrent