Странная ошибка (не удалось найти метод) только на Android 1.6
Я попытался добавить следующий класс в свое приложение:
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 ответа
Я думаю, что внутри getDarkDialogBuilder
вы вызываете конструктор с двумя аргументами AlertDialog.Builder(Context context, int theme)
, Это было введено на уровне API 11. Для более ранних уровней API у вас есть только конструктор с одним аргументом: AlertDialog.Builder(Context context)
,
Кроме того, это улучшило бы качество помощи, которую вы получаете на этом форуме, если вы разместите соответствующие части своего кода. Если проблема исчезнет, когда вы закомментируете метод getDarkDialogBuilder
, тогда вы должны опубликовать весь источник для метода.
Я предполагаю, что выполняемая вами операция не поддерживается в версии 1.6 и не представлена в других версиях, которые вы тестировали. Другой способ проверить это предположение - перейти к javadocs для этого метода и посмотреть, поскольку:, он показывает, какой метод версии был представлен.