Странная ошибка (не удалось найти метод) только на Android 1.6 - PullRequest
2 голосов
/ 28 марта 2012

Я пытался добавить следующий класс в свое приложение:

public class AlertDialogHelper {

    public static AlertDialog.Builder getDarkDialogBuilder(Context context) {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            int alertDialogTheme = AlertDialog.THEME_HOLO_DARK;

            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                alertDialogTheme = AlertDialog.THEME_DEVICE_DEFAULT_DARK;
            }

            return new AlertDialog.Builder(context, alertDialogTheme);
        }

        return new AlertDialog.Builder(context);
    }

    public static AlertDialog getDeleteNoteDialog(Context context, OnClickListener deleteListener) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);

        builder.setMessage(R.string.dialog_delete_message);

        builder.setPositiveButton(R.string.button_delete, deleteListener);

        builder.setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }

        });

        return builder.create();
    }

}

Когда бы и где бы я ни звонил AlertDialogHelper.getDeleteNoteDialog(this, null) во время работы на Android 1.6, я получаю следующую ошибку:

03-28 18:56:07.828: E/dalvikvm(303): Could not find method android.app.AlertDialog$Builder.<init>, referenced from method net.ricardoamaral.apps.notificationagenda.AlertDialogHelper.getDarkDialogBuilder
03-28 18:56:07.828: W/dalvikvm(303): VFY: unable to resolve direct method 40: Landroid/app/AlertDialog$Builder;.<init> (Landroid/content/Context;I)V
03-28 18:56:07.828: W/dalvikvm(303): VFY:  rejecting opcode 0x70 at 0x0010
03-28 18:56:07.828: W/dalvikvm(303): VFY:  rejected Lnet/ricardoamaral/apps/notificationagenda/AlertDialogHelper;.getDarkDialogBuilder (Landroid/content/Context;)Landroid/app/AlertDialog$Builder;
03-28 18:56:07.828: W/dalvikvm(303): Verifier rejected class Lnet/ricardoamaral/apps/notificationagenda/AlertDialogHelper;

Это прекрасно работает на любой другой версии выше 1.6. Если честно, я проверял это только на 2.1, 2.3 и 4.0. Я предполагаю, что это также работает на всех других (хотя это может быть не так).

Если я прокомментирую первый метод в классе AlertDialogHelper (тот, на который жалуется ошибка), ошибка идет своим чередом. Но мне нужен этот метод для других вещей, и ошибка все равно обнаружится, если я тоже вызову этот метод.

РЕШЕНИЕ БЕЗ ОТРАЖЕНИЯ:

Чтобы исправить проблему, я добавил следующий класс как nested-class к AlertDialogHelper:

private static class Compatibility {
    public static AlertDialog.Builder createAlertDialogBuilder(Context context, int alertDialogTheme) {
        return new AlertDialog.Builder(context, alertDialogTheme);
    }
}

Затем в методе getDarkDialogBuilder вместо вызова этого:

return new AlertDialog.Builder(context, alertDialogTheme);

Я называю это:

return Compatibility.createAlertDialogBuilder(context, alertDialogTheme);

Вот как я исправлял подобные проблемы, и до сих пор у меня не было проблем с этим методом.

Ответы [ 2 ]

7 голосов
/ 28 марта 2012

Я предполагаю, что внутри getDarkDialogBuilder вы вызываете конструктор с двумя аргументами AlertDialog.Builder(Context context, int theme).Это было введено на уровне API 11. Для более ранних уровней API у вас есть доступный конструктор с одним аргументом: AlertDialog.Builder(Context context).

Кроме того, это улучшит качество помощи, которую вы получаете с этого форумаесли вы разместили соответствующие части вашего кода.Если проблема исчезнет, ​​когда вы закомментируете метод getDarkDialogBuilder, вы должны опубликовать весь источник метода.

0 голосов
/ 28 марта 2012

Я предполагаю, что выполняемая вами операция не поддерживается в версии 1.6 и не представлена ​​в других протестированных вами версиях.Другой способ проверить это предположение - перейти к javadocs для этого метода и посмотреть, поскольку :, он показывает, какой метод версии был введен.

...