2

次のクラスをアプリに追加しようとしました。

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);

これが私が同様の問題を修正してきた方法であり、これまでのところ、この方法で問題は発生していません。

4

2 に答える 2

7

私の推測では、getDarkDialogBuilderあなたの内部では2つの引数のコンストラクターを呼び出していますAlertDialog.Builder(Context context, int theme)。これはAPIレベル11で導入されました。以前のAPIレベルでは、単一引数のコンストラクターのみを使用できますAlertDialog.Builder(Context context)

余談ですが、コードの関連部分を投稿すると、このフォーラムから得られるヘルプの品質が向上します。メソッドをコメントアウトしたときに問題が解決した場合はgetDarkDialogBuilder、メソッドのソース全体を投稿する必要があります。

于 2012-03-28T19:20:03.850 に答える
0

私の推測では、そこで実行している操作はバージョン1.6でサポートされておらず、テストした他のバージョンで導入されています。この仮定を検証する他の方法は、このメソッドのjavadocsにアクセスして、次のことを確認することです。これは、どのバージョンのメソッドが導入されたかを示しています。

于 2012-03-28T19:09:58.173 に答える