0

我想创建一个函数,在屏幕上显示一个带有 2 个按钮的对话框,如果用户按下确定则返回 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;
}

}

我现在确信我做得对,因为我不知道如何将结果从更底层的类传递给外部类。有错误信息

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

4 回答 4

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 中调用一个实现适当的代码onClick

于 2013-02-26T18:53:52.357 回答
1

如果您想本着 Android 的精神编写代码,您实际上应该使用 startActivityForResult。查看链接的答案,了解它应该如何工作的详细信息。(这里是文档

于 2013-02-26T19:04:42.407 回答
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。希望能帮助到你。此致。

于 2013-02-26T18:53:27.357 回答
-1

创建rez属性而不是局部变量。正如你的方法一样static,属性也应该是。这意味着将定义移到方法之外。

公共类 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是。也许您想重新考虑您的代码。

于 2013-02-26T18:53:40.293 回答