2010-10-23 21 views
2

在我的活动中,我需要带有水平进度条的ProgressDialog以可视化后台任务的进度。要使活动关注对话框,例如在屏幕旋转的情况下,我想使用在onCreateDialog中创建的托管对话框。问题是,我需要在创建对话框后更新对话框的进度条,因此我需要对托管进度对话框的引用:有谁知道如何检索对由onCreateDialog创建的对话框的引用吗?Gettring对托管ProgressDialog的引用

在我存储在onCreateDialog创建对话框引用的那一刻,但我的失败,并在屏幕后onFinished()方法InvalidArgumentException已旋转(和活动已经重建):

public final class MyActivity extends Activity { 
    private static final int DIALOG_PROGRESS = 0; 
    private ProgressDialog progressDialog = null; 

    // [...] 

    @Override 
    protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case DIALOG_PROGRESS: 
     progressDialog = createProgressDialog(); 
     return progressDialog; 
    default: 
     return super.onCreateDialog(id); 
    } 
    } 

    // [...] 

    public void updateProgress(int progress) { 
    progressDialog.setProgress(0); 
    } 

    public void onFinished() { 
    progressDialog.dismiss(); 
    } 

    // [...] 
} 

我会期待类似于Activity类中的getDialog(int)方法来获取托管对话框的引用,但似乎并不存在。有任何想法吗?

回答

3

我回答自己:

  1. 真的是在Activity类没有可用的getDialog(int)方法。
  2. 存储如上所示的参考正常工作 - 这个bug是别的东西......

的问题是,该并行线程,调用该方法onFinished()叫上已经破坏活动这种方法,因此访问的ProgressDialog实例仍然存在,但不再是有效的对话框。相反,另一个活动ProgressDialog已由Android创建。

所以我需要做的就是让后台线程调用新活动的onFinished()方法,一切正常。要切换参考,我将覆盖Activity类的onRetainNonConfigurationInstance()getLastNonConfigurationInstance()方法。

所示示例的好处是:Android真正关心在屏幕方向更改后重新创建新对话框。因此,构建ProgressDialog这种方式肯定比使用ProgressDialog.show()更容易,在这种情况下,我需要自行处理对话重新创建(上述两种方法将是一个很好的选择。