2010-07-22 75 views
4

alt text http://img252.imageshack.us/img252/643/snakesonadialog.pngProgressDialog另一张空白对话框

嗨伙计内筑巢,

所以我把一个应用程序的收尾而且还是与应用程序作为一个整体一个悬而未决的问题。

我在ProgressDialogs的形式显示负载指示器同时拉动数据从网络向下。出于某种原因,我的ProgressDialogs似乎嵌套在另一个空白对话框内。结果很俗气。

我的布局代码如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
style="@style/Theme.MyTheme.EpisodeList"> 
    <ImageView android:src="@drawable/featured" 
     android:layout_width="fill_parent" 
     android:layout_height="50sp" 
     android:layout_gravity="top" 
     android:shadowRadius="0" 
     android:shadowColor="#FFFFFF" 
     android:id="@+id/header_image" 
    /> 
    <ListView android:id="@+id/android:list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
    /> 
</LinearLayout> 

我用它来显示ProgressDialog的代码如下:

// In my class definition 
private ProgressDialog p; 

// in my onCreate method 
p = new ProgressDialog(EpisodeActivity.this, ProgressDialog.STYLE_SPINNER); 
p.setMessage("Loading..."); 
p.show(); 

从外观上来看,如果它,没有什么,似乎不妥。我还附上一张照片来说明问题。

任何帮助表示赞赏!

回答

2

后把玩周围的几天,我想通了处理ProgressDialogs的最佳方式。处理简单的ProgressDialogs在Android平台上肯定过于复杂,但这并不意味着我们有任何借口不能与它们合作。希望它会在将来变得更好(随着文档)。这是我的最佳做法。

空白对话框内的ProgressDialog的嵌套问题似乎是被一个2.1或2.2系统上运行的预2.0代码的问题。我只能猜测show()方法也调用了super.show(),它在2.1和2.2上表现不同。

所以,我发现它的效果最好,如果你不要在ProgressDialog对象直接调用显示()。相反,使用内置的showDialog()和onCreateDialog()方法来调整对话框。这是一个代码片段:

private static final int ID_DIALOG_LOADING = 0; 

@Override 
protected void onCreate(Bundle tedBundy) { 
    // Do stuff 

    showDialog(ID_DIALOG_LOADING); 

    // Do more stuff in a thread 
} 

@Override 
public void run() { 
    // Do some stuff in this thread 
    handler.sendEmptyMessage(0); 
} 

private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     // Let adapters know the data under them have changed 

     try { 
      dimissDialog(ArticlesList.ID_DIALOG_LOADING); 
      removeDialog(ArticlesList.ID_DIALOG_LOADING); 
     } catch (Exception e) {} 
    } 
} 

@Override 
protected Dialog onCreateDialog(int id) { 
    if (id == ID_DIALOG_LOADING) { 
     ProgressDialog loadingDialog = new ProgressDialog(this); 
     loadingDialog.setMessage("Loading..."); 
     loadingDialog.setIndeterminate(true); 
     loadingDialog.setCancelable(true); 
     return loadingDialog; 
    } 

    return super.onCreateDialog(id); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    try { 
     Log.i("ArticlesList.onSaveInstanceState", "Chirp chirp"); 
     dismissDialog(ArticlesList.ID_DIALOG_LOADING); 
     removeDialog(ArticlesList.ID_DIALOG_LOADING); 
    } catch (Exception e) { 

    } 

    super.onSaveInstanceState(outState); 
} 

@Override 
protected void onDestroy() { 
    try { 
     dismissDialog(ArticlesList.ID_DIALOG_LOADING); 
     removeDialog(ArticlesList.ID_DIALOG_LOADING); 
    } catch (Exception e) { 

    } 

    super.onDestroy(); 
} 

@Override 
protected void onPause() { 
    try { 
     dismissDialog(ArticlesList.ID_DIALOG_LOADING); 
     removeDialog(ArticlesList.ID_DIALOG_LOADING); 
    } catch (Exception e) { 

    } 

    super.onPause(); 
} 

@Override 
public void onDetachedFromWindow() { 
    try { 
     dismissDialog(ArticlesList.ID_DIALOG_LOADING); 
      removeDialog(ArticlesList.ID_DIALOG_LOADING); 
    } catch (Exception e) { 

    } 

    super.onDetachedFromWindow(); 
} 

这是一个很长的代码片段。您还会看到一连串重复的代码,它们不断尝试杀死那个对话框。这样做是因为Android会在电话被旋转时销毁并重新创建视图。希望在将来的版本中,只要用户旋转屏幕,窗口就不会完成销毁和重新加载,而是实现onScreenRotate()方法。

尝试一些不同的方式后,该哈克的解决方案似乎是提供去除ProgressDialog的一致,快速结果的唯一的事情。希望这可以在将来节省几天的时间。

+0

我想显示嵌套对话。请告诉我该怎么做? – 2011-09-20 06:45:04

1

我已经通过分两步构建对话框固定同一个问题:

ProgressDialog progressDia = new ProgressDialog(this); 
progressDia.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
相关问题