2012-03-28 82 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並查看自:,它顯示引入了哪個版本的方法。