次のクラスをアプリに追加しようとしました。
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();
}
}
Android 1.6で実行しているときにいつでもどこでも電話をかけるとAlertDialogHelper.getDeleteNoteDialog(this, null)
、次のエラーが発生します。
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);
これが私が同様の問題を修正してきた方法であり、これまでのところ、この方法で問題は発生していません。