2012-03-28 71 views
2

我试着下面的类添加到我的应用程序:奇怪的错误(找不到方法)在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类(错误所抱怨的那个)中评论第一个方法,错误就会消失。但是我需要这种方法来处理其他事情,而且如果我也调用了这个方法,则会出现错误。

解决方案,而反思:

要解决这个问题,我已经添加下面的类嵌套类到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); 

这就是我一直在解决类似的问题,到目前为止我还没有任何问题与此方法。

+0

根据您的应用程序不同,我会说不必担心1.6 – Phix 2012-03-28 19:09:39

+1

如果您打算使用代码清单,实际显示失败的调用通常是个好主意。 – CommonsWare 2012-03-28 19:12:06

+0

@Pix我的应用已经发布,它支持1.6。在这个版本中我没有很多用户,这是一个事实,但我宁愿继续支持它。 – 2012-03-29 00:31:19

回答

7

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

另外,如果您发布了代码的相关部分,它会提高您从此论坛获得的帮助的质量。如果在注释掉方法getDarkDialogBuilder时问题消失,则应该发布方法的整个源。

+0

我知道OP说他在2.1和2.3上测试过了,但是我认为Ted是对的。请注意无法找到堆栈跟踪的方法:'Landroid/app/AlertDialog $ Builder ;. (Landroid/content/Context; I)' – kabuko 2012-03-28 19:22:28

+0

@kabuko - 究竟是什么让我回答我的答案。我想知道当OP在2上测试时可能没有调用有问题的方法。1和2.3。 – 2012-03-28 19:26:42

+0

@TedHopp是的,我调用了'getDarkDialogBu​​ilder'中的2参数构造函数(但我确实有一个'if'来查看我是否可以使用它)。我没有发布整个方法,因为我的测试让我相信这是无关紧要的。我似乎没有正确地测试它。 – 2012-03-29 00:38:24

0

我的猜测是,您正在执行的操作在版本1.6中不受支持,并在您测试的其他版本中引入。验证此假设的其他方法是,转到此方法的javadoc并查看自:,它显示引入了哪个版本的方法。