仅在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();
    }
}

在安卓1.6上运行时,无论何时何地,我都会调用AlertDialogHelper.getDeleteNoteDialog(this, null),我会收到以下错误:

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类中的第一个方法(错误抱怨的方法)进行注释,那么错误就会发生。但我需要该方法来做其他事情,如果我也调用该方法,错误就会出现。

无反射解决方案:

为了解决这个问题,我将以下类作为嵌套类添加到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);

这就是我解决类似问题的方法,到目前为止,我还没有遇到这种方法的任何问题。

我的猜测是,在getDarkDialogBuilder中,您正在调用双参数构造函数AlertDialog.Builder(Context context, int theme)。这是在API第11级中引入的。对于早期的API级别,只有可用的单参数构造函数:AlertDialog.Builder(Context context)

顺便说一句,如果你发布了代码的相关部分,这将提高你从这个论坛获得的帮助的质量。如果当您注释掉方法getDarkDialogBuilder时问题消失了,那么您应该发布该方法的整个源代码。

我的猜测是,您在那里执行的操作在1.6版本中不受支持,并在您测试的其他版本中引入。验证这一假设的另一种方法是,转到javadocs中查看此方法,并查看由于:,它显示了引入了哪个版本的方法。

相关内容

  • 没有找到相关文章

最新更新