0

私はアンドロイド開発が初めてなので、ご容赦ください。私は最近、いくつかのダイアログ ボックスのチュートリアルに従っており、ダイアログ ボックスを作成してユーザーに表示するのがいかに冗長であるかを認識しました。そこで、関連するすべてのダイアログ ボックス コードを便利な静的メソッドに配置しました。下記参照:

public static boolean dialog(Context context, String text)
{
    boolean result = false;
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(text);
    builder.setCancelable(false);
    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener()  {
            public void onClick(DialogInterface dialog, int id) {
                result = true;}
            });
    builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                result = false;}
            });
    AlertDialog dialog = builder.create();
    dialog.show();
    return result;
}

ただし、コンパイラが行result = trueまたはresult = false. エラーを返しますCannot refer to a non-final variable result inside an inner class defined in a different method

この回答の解決策を探しましたが、すべての回答が適切に理解されていないか、問題の適切な解決策ではありませんでした (たとえば、変数を「final」にすることはできません)。

この問題を解決するための提案は大歓迎です。

4

5 に答える 5

0

どこかに独自のコールバック インターフェイスを作成できます

public interface DialogResult {
    void onDialogResult(boolean result);
}

次に、それをダイアログに渡します

public static void dialog(Context context, String text, final DialogResult callback) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(text);
    builder.setCancelable(false);
    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener()  {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                callback.onDialogResult(true);
                }
            });
    builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                callback.onDialogResult(false);
                }
            });
    AlertDialog dialog = builder.create();
    dialog.show();
}

ダイアログは将来のある時点で、コールバックを使用して結果を通知します。未来から結果を返すことはできません。

次に、他のすべてのコールバックと同じように使用します

static class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ....
        Button b = (Button) findViewById(R.id.someButton);
        b.setOnClickListener(mOnClickListener);
    }

    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // show dialog at some point
            dialog(v.getContext(), "Hello Dialog", mDialogCallback);
        }
    };

    private DialogResult mDialogCallback = new DialogResult() {
        @Override
        public void onDialogResult(boolean result) {
            // do something with the result
        }
    };
}
于 2013-07-02T10:47:37.687 に答える
0

resultメソッドの外で宣言します。

static boolean result = false;

public static boolean dialog(Context context, String text) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(text);
    builder.setCancelable(false);
    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener()  {
        public void onClick(DialogInterface dialog, int id) {
            result = true;
        }
    });
    builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            result = false;
        }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
    return result;
}
于 2013-07-02T10:19:26.847 に答える
0

local匿名デリゲートによって参照されるJava 変数のクロージャーによる副作用を回避するには、 としてマークする必要がありますfinalそれをクラス/静的変数にすることができます。

于 2013-07-02T10:20:29.247 に答える
-1

ローカル クラスは、final と宣言されたローカル変数にのみアクセスできます。

于 2014-04-14T12:03:45.650 に答える