我試着下面的類添加到我的應用程序:奇怪的錯誤(找不到方法)在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);
這就是我一直在解決類似的問題,到目前爲止我還沒有任何問題與此方法。
根據您的應用程序不同,我會說不必擔心1.6 – Phix 2012-03-28 19:09:39
如果您打算使用代碼清單,實際顯示失敗的調用通常是個好主意。 – CommonsWare 2012-03-28 19:12:06
@Pix我的應用已經發布,它支持1.6。在這個版本中我沒有很多用戶,這是一個事實,但我寧願繼續支持它。 – 2012-03-29 00:31:19