0

我是android开发的新手,所以请多多包涵。我最近一直在关注一些对话框教程,并意识到创建对话框并将其显示给用户是多么冗长。所以我把所有相关的对话框代码放到了一个方便的静态方法中。见下文:

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 = trueresult = false. 它返回错误Cannot refer to a non-final variable result inside an inner class defined in a different method

我一直在寻找这个答案的解决方案,但是我没有正确理解所有答案,或者它们不是我的问题的正确解决方案(例如,我不能只将变量设为“最终”)。

任何解决此问题的建议将不胜感激。

4

5 回答 5

1

Ken Wolf 的回答不是解决方案。你不知道吗,那个对话框(...)会在你触摸对话框按钮之前返回结果?它的 Java 基础知识。你需要在 onClick 中做一些事情,比如调用getActivity().onDialogYesButton()getActivity().onDialogNoButton()

于 2013-07-02T10:37:14.093 回答
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 回答
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 回答
-1

局部类只能访问声明为 final 的局部变量。

于 2014-04-14T12:03:45.650 回答