Android - java.lang.IllegalArgumentException Erron при создании диалога на 2.1 и низком андроиде - PullRequest
2 голосов
/ 07 июня 2011

Я получаю сообщение об ошибке ниже от телефонов, которые имеют версию SDK <8. Я только что выпустил это приложение на рынке Android, и до выпуска мои тестовые телефоны были HTC Thunderbolt и Droid X. Ни у одной не было этой проблемы в все. </p>

Я получаю это сообщение об ошибке через Flurry. Я не могу проверить это напрямую, потому что у меня нет телефона с SDK <8 и по какой-то причине я не могу заставить свой эмулятор запустить более низкую версию, чем набор SDK по умолчанию для приложения. </p>

java.lang.IllegalArgumentException, android.app.Activity.createDialog: 880 - (Activity # onCreateDialog не создал диалоговое окно для идентификатора 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();
            }
        });

Ответы [ 5 ]

2 голосов
/ 18 декабря 2012

Имеет проблему также и решил ее следующим образом:

- Не возвращает пустой диалог в методе: защищенный диалог onCreateDialog (int id)

В Android 2.1 в Activity.java ошибка была поднята в строке 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):

защищенный диалог onCreateDialog (int id, Bundle bundle);

использовать:

защищенный диалог onCreateDialog (int id);

-Я также использовал следующую проверку (был особый случай с настраиваемым диалогом):

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

Может быть, это кому-нибудь поможет...

2 голосов
/ 07 июня 2011

Я считаю, что самый простой способ справиться с этим неприятным исключением - просто поймать его:

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

Тем не менее, я не думаю, что вы используете onCreateDialog() в качестве предназначенного API (именно поэтому вы видели странное поведение), оно должно определенно возвращать объект диалога большинство из время.

2 голосов
/ 07 июня 2011

Ах, посмотрите на ваш код:

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

Вы установили dialog на ноль: именно поэтому вы получаете ошибку.Сделайте это:

dialog = new CustomCalcDialog(this);
        dialog.setTitle("Enter Shipping %");
        activeTextView = shippingPercent;
        break;
1 голос
/ 07 июня 2011

Мне пришлось избавиться от диалогового окна = null.Мне также пришлось переместить переключение между activeTextView с onCreateDialog (int id) на 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;
    }
}
0 голосов
/ 07 июня 2011

Это потому, что вы возвращаете null из вашего onCreateDialog(int id) метода (этот метод устарел).

Вместо этого используйте this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...