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

問題もあり、次のようにして解決しました。

-メソッドでnullダイアログを返さないでください:protected Dialog onCreateDialog(int id)

Activity.javaのAndroid2.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を見ると、nullダイアログのチェックがあり、リターンが表示されます。だからここでそれは動作します。

-バンドルを使用しないでください(API8で変更):

保護されたダイアログonCreateDialog(int id、バンドルバンドル);

使用する:

保護されたダイアログonCreateDialog(int id);

-次のチェックも使用しました(カスタムダイアログの特殊なケースがありました)。

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

多分それは誰かを助けます...

于 2012-12-18T17:52:26.180 に答える
2

この厄介な例外に対処する最も簡単な方法は、それをキャッチすることだと思います。

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

とはいえ、API が意図したとおりに使用しているとは思いません(これが、奇妙な動作が見られた理由です)。ほとんどonCreateDialog()の場合、間違いなくダイアログ オブジェクトを返すはずです。

于 2011-06-07T01:29:03.977 に答える
2

ああ、あなたのコードを見てください:

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

null に設定dialogすると、エラーが発生するのはそのためです。これを行う:

dialog = new CustomCalcDialog(this);
        dialog.setTitle("Enter Shipping %");
        activeTextView = shippingPercent;
        break;
于 2011-06-07T01:00:41.140 に答える
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

これは、メソッドから null を返しているためですonCreateDialog(int id)(このメソッドは非推奨です)。

代わりにこれを使用してください。

于 2011-06-07T01:01:51.537 に答える