仅在Android 1.6上出现奇怪的错误(无法找到方法)

Ric*_*ral 2 methods android dalvik android-1.6-donut

我试图将以下类添加到我的应用程序:

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

}
Run Code Online (Sandbox Code Playgroud)

无论何时何地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;
Run Code Online (Sandbox Code Playgroud)

这适用于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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在该getDarkDialogBuilder方法中,而不是调用此:

return new AlertDialog.Builder(context, alertDialogTheme);
Run Code Online (Sandbox Code Playgroud)

我这叫:

return Compatibility.createAlertDialogBuilder(context, alertDialogTheme);
Run Code Online (Sandbox Code Playgroud)

这就是我一直在修复类似问题的方法,到目前为止我还没有遇到任何与此方法有关的问题.

Ted*_*opp 7

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

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