如何从单独的类中的对话框返回值

时间:2013-02-26 18:46:56

标签: java android class android-alertdialog

我想创建一个功能,在屏幕上显示一个带有2个按钮的对话框,如果用户按下OK则返回1,如果用户按下取消,则返回0。

public class CDlg {

static int ShowConfirm(String caption, String msg, Context context) {
    int rez;
    AlertDialog.Builder delAllDialog = new AlertDialog.Builder(context);
    delAllDialog.setTitle(caption);

    TextView dialogTxt_id = new TextView(context);
    LayoutParams dialogTxt_idLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    dialogTxt_id.setLayoutParams(dialogTxt_idLayoutParams);
    dialogTxt_id.setText(msg);
    LinearLayout layout = new LinearLayout(context);
    layout.setOrientation(LinearLayout.VERTICAL);
    layout.addView(dialogTxt_id);
    delAllDialog.setView(layout);

    delAllDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface arg0, int arg1) {
            rez = 1;
        }
    });

    delAllDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface arg0, int arg1) {
            rez = 0;
        }
    });

    delAllDialog.show();
    return rez;
}

}

我现在感到害羞,我做得对,因为我不知道如何将结果从unner类传递给外层类。有错误消息

Cannot refer to a non-final variable rez inside an inner class defined in a different method

因此,我希望使用这样的函数:

if (CDlg.ShowConfirm("User confirmation","Delete?",this)==1){
        ...
}

4 个答案:

答案 0 :(得分:1)

你不能那样做。 ShowConfirm只能显示对话框。当用户单击“确定”或“取消”按钮时,只有这样您才能执行所需的操作:

public class CDlg {
    void ShowConfirm(String caption, String msg) {
        AlertDialog.Builder delAllDialog = new AlertDialog.Builder(this);
        delAllDialog.setTitle(caption);

        TextView dialogTxt_id = new TextView(this);
        LayoutParams dialogTxt_idLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        dialogTxt_id.setLayoutParams(dialogTxt_idLayoutParams);
        dialogTxt_id.setText(msg);
        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.addView(dialogTxt_id);
        delAllDialog.setView(layout);

        delAllDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                handleButtonClick(1);
            }
        });

        delAllDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                handleButtonClick(2);
            }
        });

        delAllDialog.show();
    }

    void handleButtonClick(int rez) {
        switch(rez) {
            case 1: ..... break;
            case 2: ..... break;
            .....
        }
    }
}

这里的if (CDlg.ShowConfirm("User confirmation","Delete?",this)==1)语句在Android中没用,因为ShowConfirm不会等到用户按下按钮。

而只需在ShowConfirm("User confirmation","Delete?"); s。{/ p>中调用onClick一个实现代码

答案 1 :(得分:1)

如果你想以Android的精神进行编码,你应该使用startActivityForResult。查看链接的答案,了解它应该如何工作的详细信息。 (here is the documentation

答案 2 :(得分:0)

在所需的类中定义静态变量,例如我将在MyAuxiliaryClass.java中定义:

public static USER_DECISION = -1;

每当您选择一个选项时,您都会执行以下操作:

if (//Desicion == OK) {
MyAuxiliaryClass.USER_DECISION = 1;
} else (//Decision == NOT OK){
MyAuxiliaryClass.USER_DECISION = 2;
}

由于您正在更改此静态变量,因此您可以在另一个类中获取值1或2。希望能帮助到你。最好的问候。

答案 3 :(得分:-1)

使rez成为属性而不是局部变量。由于您的方法是static,因此该属性也应如此。这意味着将定义移到方法之外。

public class CDlg {

   static int rez;

   static int ShowConfirm(String caption, String msg, Context context) {
   ...

在内部类中,您需要引用CDlg类

   public void onClick(DialogInterface arg0, int arg1) {
        CDlg.rez = 1;
   }

作为旁注,你使用static方法很奇怪。 Java / OOP新手的错误之一是滥用static代码,感觉更像是C。也许你想重新考虑你的代码。