我试着下面的类添加到我的应用程序:奇怪的错误(找不到方法)在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