0

画面に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クラスからouterクラスに結果を渡す方法がわからないので、私は今、自分が正しくやっていると確信しています。エラーメッセージがあります

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ダイアログのみを表示できます。ユーザーが[OK]または[キャンセル]ボタンをクリックすると、必要な操作を実行できます。

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)ShowConfirmはユーザーがボタンを押すまで待機しないため、このステートメントはAndroidでは役に立ちません。

代わり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に不慣れな人々の過ちの1つは、staticコードを悪用することCです。たぶんあなたはあなたのコードを再考したいと思うでしょう。

于 2013-02-26T18:53:40.293 に答える