Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-java.lang.IllegalArgumentException在2.1和低版本Android上创建对话框时出错_Android_Dialog_Illegalargumentexception - Fatal编程技术网

Android-java.lang.IllegalArgumentException在2.1和低版本Android上创建对话框时出错

Android-java.lang.IllegalArgumentException在2.1和低版本Android上创建对话框时出错,android,dialog,illegalargumentexception,Android,Dialog,Illegalargumentexception,我从SDK版本

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

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

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

下面是我实现的onCreateDialog(intID)

@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();
            }
        });
private void registerListeners(){
enterTotal.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
试一试{
calcLogic(等于);
}捕获(例外情况除外){}
操作员更改=不更改;
activeTextView.setText(calcDialogDisplay.getText().toString());
试一试{
if((Float.parseFloat(calcDialogDisplay.getText().toString())<0){}
}捕获(例外情况除外){
activeTextView.setText(“0”);
}
数学计算();
CustomCalcDialog.this.disclose();
}
});
啊,看看你的代码:

dialog = new CustomCalcDialog(this);
        dialog.setTitle("Enter Shipping %");
        activeTextView = shippingPercent;
        dialog.show();
        dialog = null;
        break;
您将对话框设置为空:这就是为什么会出现错误。请执行以下操作:

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

这是因为您正在从方法返回null(此方法已弃用)


相反,请使用。

我认为处理这个讨厌的异常最简单的方法就是捕捉它:

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

也就是说,我不认为您使用的是API想要的
onCreateDialog()
(这就是为什么您看到这种奇怪的行为),大多数时候它肯定会返回一个dialog对象。

我最后不得不去掉dialog=null。我还必须从onCreateDialog(int-id)移动activeTextView之间的切换到onPrepareDialog(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 %");
        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;
    }
}

也有问题,并通过以下方式解决:

-在方法:protecteddialog 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中查看,会有一个空对话框的检查,它的handled带有一个返回

-不使用捆绑包(在API8中更改):

受保护的对话框onCreateDialog(int-id,Bundle)

使用:

受保护的对话框onCreateDialog(int-id)

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


if(Build.VERSION.SDK_INT当我第一次写这段代码时,我按照你说的做了,我得到了很多奇怪的结果,activeTextView变得一团糟。所以我在对话框中添加了=null。它修复了这个问题。有没有一种方法可以保持null,但不返回null的对话框?如果你使用what我在回答中建议。问题是,如果您返回null,将不会创建任何对话框。在您的示例中,您没有dialog.show();这是故意的吗?是的:一旦您在
onCreateDialog
中返回非空对话框,该对话框将自动为您显示。虽然不确定您的activeTextView出现问题的原因,但从2.0开始,在每个版本的多个应用程序中,这对我来说都是可靠的。如果我使用onCreateDialog(int,Bundle)它仍然与2.1和低版本兼容吗?@KevinM可能不兼容,因为2.1和之前版本没有此调用。我只需要在super.showDialog或该方法的所有细节上添加try/catch吗?只有super,在
onCreateDialog()的细节上添加一个
不会真正帮助您,因为那里没有抛出异常。我找到了产生这种奇怪行为的原因,并成功地消除了空值。我最终将activeTextView移动到onPrepareDialog(int id,Dialog)。这使我不需要对话框=null。长话短说,它工作得很好。很高兴听到你找到了它!:)@dmon,它应该放在哪里?当我将它添加到活动中时,Eclipse将其标记为
无法覆盖活动的最终方法
    if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.ECLAIR_MR1) {
        return dialog;
    } else {
        return null;
    }