Search code examples
androidmethodsdalvikandroid-1.6-donut

Strange error (could not find method) on Android 1.6 only


I've tried to add the following class to my app:

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

}

Whenever and wherever I call AlertDialogHelper.getDeleteNoteDialog(this, null) while running on Android 1.6, I get the following error:

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;

This works just fine on any other version above 1.6. To be honest I only tested this on 2.1, 2.3 and 4.0. I assume it also works on all others (it might not be true though).

If I comment the first method in the AlertDialogHelper class (the one the error is complaining about), the error goes way. But I need that method for other things and the error shows up anyway if I call that method too.

SOLUTION WITHOUT REFLECTION:

To fix the problem I've added the following class as nested-class to AlertDialogHelper:

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

Then, in the getDarkDialogBuilder method, instead of calling this:

return new AlertDialog.Builder(context, alertDialogTheme);

I call this:

return Compatibility.createAlertDialogBuilder(context, alertDialogTheme);

This is how I've been fixing similar problems and so far I haven't had any issues with this method.


Solution

  • My guess is that inside getDarkDialogBuilder you are calling the two-argument constructor AlertDialog.Builder(Context context, int theme). That was introduced in API level 11. For earlier API levels, you only have the single-argument constructor available: AlertDialog.Builder(Context context).

    As an aside, it would improve the quality of help that you get from this forum if you posted the relevant parts of your code. If the problem goes away when you comment out the method getDarkDialogBuilder, then you should post the entire source for the method.