Java 显示ProgressDialog时Android获取错误

Java 显示ProgressDialog时Android获取错误,java,android,dialog,progressdialog,Java,Android,Dialog,Progressdialog,我有一个活动,我想在其中显示ProgressDialog。我在活动中重写onCreateDialog。每次在onCreateDialog中返回对话框时,我都会得到一个强制关闭,并说: 07-13 13:10:11.449: ERROR/AndroidRuntime(8720): android.util.AndroidRuntimeException: requestFeature() must be called before adding content 07-13 13:10:11

我有一个活动,我想在其中显示ProgressDialog。我在活动中重写onCreateDialog。每次在onCreateDialog中返回对话框时,我都会得到一个强制关闭,并说:

07-13 13:10:11.449: ERROR/AndroidRuntime(8720): android.util.AndroidRuntimeException:     requestFeature() must be called before adding content
07-13 13:10:11.449: ERROR/AndroidRuntime(8720):     at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:181)
07-13 13:10:11.449: ERROR/AndroidRuntime(8720):     at com.android.internal.app.AlertController.installContent(AlertController.java:199)
07-13 13:10:11.449: ERROR/AndroidRuntime(8720):     at android.app.AlertDialog.onCreate(AlertDialog.java:251)
07-13 13:10:11.449: ERROR/AndroidRuntime(8720):     at android.app.ProgressDialog.onCreate(ProgressDialog.java:176)
07-13 13:10:11.449: ERROR/AndroidRuntime(8720):     at android.app.Dialog.dispatchOnCreate(Dialog.java:307)
07-13 13:10:11.449: ERROR/AndroidRuntime(8720):     at android.app.Activity.createDialog(Activity.java:886)
07-13 13:10:11.449: ERROR/AndroidRuntime(8720):     at android.app.Activity.showDialog(Activity.java:2557)
07-13 13:10:11.449: ERROR/AndroidRuntime(8720):     at     android.app.Activity.showDialog(Activity.java:2524)
onCreateDialog(int id)如下所示:

    protected Dialog onCreateDialog(int id){
    switch (id) {
    case DOWNLOAD_DIALOG:
        ProgressDialog dialog = new ProgressDialog(ListMapActivity.this);
        dialog.setTitle(getResources().getString(R.string.dialog_download_title));
        dialog.setCancelable(true);
        dialog.setOnCancelListener(new OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                if ((mTask.getStatus().equals(AsyncTask.Status.RUNNING) 
                    || mTask.getStatus().equals(AsyncTask.Status.PENDING)) 
                    && !mTask.isCancelled()){
                    mTask.cancel(true);
                }
                Toast.makeText(getApplicationContext(), R.string.dialog_download_cancel, Toast.LENGTH_LONG).show();
            }
        });         
        TextView tw = new TextView(ListMapActivity.this);
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        tw.setLayoutParams(params);
        tw.setText(getResources().getString(R.string.dialog_download_text));
        dialog.setContentView(tw);


        return dialog;

    default:
        return null;
    }
}
注意:我尝试直接执行ProgressDialog.Show(上下文、标题、消息),而不是showDialog(),结果如下:

07-13 13:03:42.910: ERROR/AndroidRuntime(8444): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
07-13 13:03:42.910: ERROR/AndroidRuntime(8444):     at android.view.ViewRoot.setView(ViewRoot.java:531)
07-13 13:03:42.910: ERROR/AndroidRuntime(8444):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
07-13 13:03:42.910: ERROR/AndroidRuntime(8444):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
07-13 13:03:42.910: ERROR/AndroidRuntime(8444):     at android.app.Dialog.show(Dialog.java:241)
07-13 13:03:42.910: ERROR/AndroidRuntime(8444):     at android.app.ProgressDialog.show(ProgressDialog.java:107)
07-13 13:03:42.910: ERROR/AndroidRuntime(8444):     at android.app.ProgressDialog.show(ProgressDialog.java:90)
07-13 13:03:42.910: ERROR/AndroidRuntime(8444):     at android.app.ProgressDialog.show(ProgressDialog.java:85)
我想我忘了初始化一些东西。我甚至不知道这个requestFeature()在哪里被调用。任何想法都欢迎

更新: 我玩了一会儿,发现如果我删除以下几行,一切都会恢复正常:

        LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        tw.setLayoutParams(params);
        tw.setText(getResources().getString(R.string.dialog_download_text));
        dialog.setContentView(tw);
dialog.setCancelable(true);
dialog.setTitle(getResources().getString(R.string.dialog_download_title));

因此,我不知道如何设置此视图的内容。当我以成员身份在onCreate of my Activity中创建主设计并将其放入ProgressDialog中时,它没有任何帮助。我根本不明白这个问题。将TextView动态放置为对话框中的内容有什么不对

在添加内容之前必须调用此错误消息
requestFeature()
表示您正在调用对话框上的方法,在添加内容之后不允许调用该方法

我想提出以下几点:

        LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        tw.setLayoutParams(params);
        tw.setText(getResources().getString(R.string.dialog_download_text));
        dialog.setContentView(tw);
dialog.setCancelable(true);
dialog.setTitle(getResources().getString(R.string.dialog_download_title));
使其位于这条线之前:

dialog.setContentView(tw);
setTitle是最可能出现错误的候选项。

只需尝试一下

ProgressDialog dialog = ProgressDialog.show(yourActivity.this, "", 
                        "Loading. Please wait...", true);  

谢谢。

您在哪里调用showDialog()?代码中没有显示它。实际上,我打算在onPreExecute()中从定义为活动嵌套类的AsyncTask启动它。但是如果我在活动的onCreate()或ListView的onItemClick()中调用它,我会得到相同的错误您应该使用活动或当前(活动)活动的上下文来创建对话框。@Arslan抱歉,但我没有得到您的建议如果您完全阅读了我的问题,您会发现我已经尝试过这个方法,并得到了我发布的另一个错误,如果我在onPreExecute()中调用ProgressDialog.show(),它会工作,但我没有得到功能。例如,我想取消onPostExecute()中的对话框。如果您正确阅读了我的响应,那么我提到的是“yourActivity.this”,而不是上下文。您的例外情况是上下文为空……”“令牌为空不适用于应用程序”对不起,我感到羞耻。正如我之前提到的,它现在起作用了,但我不知道有什么区别。我怎样才能管理这种“动态创建”对话框?嘿,别不好意思。如果对你有用那就太好了。我很乐意帮助你。正如我上面提到的,setTitle正在工作。是setContent()制造了麻烦