2

我从 SDK 版本 < 8 的手机收到以下错误消息。我刚刚在 android 市场上发布了这个应用程序,在发布之前我的测试手机是 HTC Thunderbolt 和 Droid X。根本没有这个问题。

我通过 Flurry 收到此错误报告。我无法直接对此进行测试,因为我没有 SDK < 8 的手机,并且由于某种原因,我无法让我的模拟器启动低于为应用程序设置的默认 SDK 的版本。

java.lang.IllegalArgumentException, android.app.Activity.createDialog:880 - (Activity#onCreateDialog 没有为 id 1 创建对话框)

下面是我实现的 onCreateDialog(int id)。

@Override
protected Dialog onCreateDialog(int id) {
    super.onCreateDialog(id);
    Dialog dialog = null;

    switch(id){
    case 1:
        dialog = new CustomCalcDialog(this);
        dialog.setTitle("Enter Shipping %");
        activeTextView = shippingPercent;
        dialog.show();
        dialog = null;
        break;
    case 2:
        dialog = new CustomCalcDialog(this);
        dialog.setTitle("Enter Tax Rate");
        activeTextView = taxPercent;
        dialog.show();
        dialog = null;
        break;
    case 3:
        dialog = new CustomCalcDialog(this);
        dialog.setTitle("Enter Commission %");
        activeTextView = commissionPercent;
        dialog.show();
        dialog = null;
        break;
    case 4:
        dialog = new CustomCalcDialog(this);
        dialog.setTitle("Calculate Subtotal");
        activeTextView = productSubtotal;
        dialog.show();
        dialog = null;
        break;
    case 5:
        dialog = new CustomCalcDialog(this);
        dialog.setTitle("Additional Shipping");
        activeTextView = addShipping;
        dialog.show();
        dialog = null;
        break;
    case 6:
        dialog = new BackgroundOptionsDialog(this);
        dialog.setTitle("Choose Background:");
        dialog.show();
        dialog = null;
        break;
    default:
        dialog = null;
    }
    return dialog;
}

下面是对话框是如何被解雇的。

private void registerListeners () {

        enterTotal.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    calcLogic(EQUALS);
                }catch(Exception ex){}
                operatorChange = DONT_CHANGE;

                activeTextView.setText(calcDialogDisplay.getText().toString());

                try {
                    if ((Float.parseFloat(calcDialogDisplay.getText().toString())) < 0) {}
                }catch(Exception ex) {
                    activeTextView.setText("0");
                }
                mathCalculations();
                CustomCalcDialog.this.dismiss();
            }
        });
4

5 回答 5

2

啊,看看你的代码:

dialog = new CustomCalcDialog(this);
        dialog.setTitle("Enter Shipping %");
        activeTextView = shippingPercent;
        dialog.show();
        dialog = null;
        break;

您设置dialog为 null:这就是您收到错误的原因。做这个:

dialog = new CustomCalcDialog(this);
        dialog.setTitle("Enter Shipping %");
        activeTextView = shippingPercent;
        break;
于 2011-06-07T01:00:41.140 回答
2

我相信处理这个讨厌的异常的最简单方法就是抓住它:

@Override
public void showDialog(int dialogId) {
  try {
    super.showDialog(dialogId);
  } catch (IllegalArgumentException e) { /* Log it if you wish*/ }
} 

也就是说,我认为您没有onCreateDialog()按照 API 的预期使用(这就是您看到奇怪行为的原因),它在大多数情况下肯定应该返回一个对话框对象。

于 2011-06-07T01:29:03.977 回答
2

也遇到了问题,并通过以下方式解决了它:

-不要在方法中返回空对话框:受保护的对话框 onCreateDialog(int id)

在 Activity.java 的 Android 2.1 中,第 871 行引发了错误。

private Dialog createDialog(Integer dialogId, Bundle state) {
869         final Dialog dialog = onCreateDialog(dialogId);
870         if (dialog == null) {
871             throw new IllegalArgumentException("Activity#onCreateDialog did "
872                     + "not create a dialog for id " + dialogId);
873         }
874         dialog.dispatchOnCreate(state);
875         return dialog;
876     }

如果您在稍后的 Android 中查看,则会检查空对话框,并且它与返回一起处理。所以在这里有效。

- 不要使用 Bundle(在 API8 中更改):

protected Dialog onCreateDialog(int id, Bundle bundle);

采用:

受保护的对话 onCreateDialog(int id);

-我还使用了以下检查(有一个带有自定义对话框的特殊情况):

    if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.ECLAIR_MR1) {
        return dialog;
    } else {
        return null;
    }

也许它可以帮助某人...

于 2012-12-18T17:52:26.180 回答
1

我最终不得不摆脱对话框= null。我还必须将 activeTextView 之间的切换从 onCreateDialog(int id) 移动到 onPrepareDialog(int id, Dialog dialog)。

以下是更新后的代码。

    @Override
protected Dialog onCreateDialog(int id) {
    super.onCreateDialog(id);
    Dialog dialog = null;

    switch(id){
    case 1:
        dialog = new CustomCalcDialog(this);
        dialog.setTitle("Enter Shipping %");
        break;
    case 2:
        dialog = new CustomCalcDialog(this);
        dialog.setTitle("Enter Tax Rate");
        break;
    case 3:
        dialog = new CustomCalcDialog(this);
        dialog.setTitle("Enter Commission %");
        break;
    case 4:
        dialog = new CustomCalcDialog(this);
        dialog.setTitle("Calculate Subtotal");
        break;
    case 5:
        dialog = new CustomCalcDialog(this);
        dialog.setTitle("Additional Shipping");
        break;
    case 6:
        dialog = new BackgroundOptionsDialog(this);
        dialog.setTitle("Choose Background:");
        break;
    }
    return dialog;
}

@Override
protected void onPrepareDialog(int id, Dialog dialog) {
    super.onPrepareDialog(id, dialog);

    switch(id){
    case 1:         
        activeTextView = shippingPercent;
        break;
    case 2:
        activeTextView = taxPercent;
        break;
    case 3:
        activeTextView = commissionPercent;
        break;
    case 4:
        activeTextView = productSubtotal;
        break;
    case 5:
        activeTextView = addShipping;
        break;
    }
}
于 2011-06-07T09:51:59.890 回答
0

这是因为您从您的onCreateDialog(int id)方法返回 null (此方法已弃用)。

而是使用这个

于 2011-06-07T01:01:51.537 回答