5

int 型の戻り値を持つ関数を作成しました。この関数では、2 つのボタンで AlertDialog をポップアップする必要があります。「はい」ボタンをクリックすると関数は0を返し、「いいえ」ボタンをクリックすると-1を返します。

public int Func(){
    final AlertDialog d=new AlertDialog.Builder(mContext).setTitle("Warning").setCancelable(false).setMessage
                       (alert)
                       .setPositiveButton("Yes",mListener).setNegativeButton("No",mListener).create();
                       d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                       d.show();
   if(mWhich.getWhich()==-1)   //the "yes" button was clicked
       return 0;
   else                        //the "no"  button was clicked
       return -1;
}

mWhich は、ユーザーの選択を記録するために使用されるクラスです

private DialogInterface.OnClickListener mListener =
            new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    mWhich.setWhich(which);
                             }
            };

今問題はコードです

if(mWhich.getWhich()==-1)
       return 0;
   else
       return -1;

ユーザーが「はい」または「いいえ」ボタンをクリックする前に実行されました。どうすればよいですか??

4

5 に答える 5

2

私が理解しているように、あなたのコードは次のようになります

// some code
int result = Func();
DoSmthWithResult(result);
// some code

はUIFuncスレッドで実行されているため、ダイアログを作成した後も実行を継続し、初期値の を返しますmWich。代わりに次DoSmthWithResultから呼び出す必要があります。onClickListener

private DialogInterface.OnClickListener mListener = new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        DoSmthWithresult(which == -1 ? 0 : -1);
    }
};

DoSmthWithResultユーザーが「はい」または「いいえ」ボタンを押した後に実行されるようになりました。

于 2012-12-03T09:16:22.917 に答える
0

確かに、リスナーを使用してクリックで新しい呼び出し階層を開始するAndroidの方法ですが(YuriyとBinoyが提案したように)、ブロックダイアログを取得する必要がある場合があります。ダイアログを表示する独自のルーパーで新しいスレッドを開始することで気づきました。そうすれば、UIスレッドは自由に実行できますが、ANRは発生しません。

于 2012-12-03T09:45:09.910 に答える
0

Func()ユーザーがいずれかのボタンをクリックする前に実行が終了する可能性があるため、この方法は不可能だと思います。メソッドの実行が終了した後は、メソッドの戻り値を変更することはできません。

whichすでにを使用して保存しているのでmWhich.setWhich(which);。後で別の関数を使用して値を読み取ることができます。

private DialogInterface.OnClickListener mListener = new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        mWhich.setWhich(which);
    }
};

public void showDialog() {
    final AlertDialog d = new AlertDialog.Builder(mContext).setTitle("Warning")
            .setCancelable(false).setMessage(alert).setPositiveButton("Yes", mListener)
            .setNegativeButton("No", mListener).create();
    d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    d.show();
}

public int func() {
    if (mWhich.getWhich() == -1)
        // the "yes" button was clicked
        return 0;
    else
        // the "no" button was clicked
        return -1;
}
于 2012-12-03T09:11:28.000 に答える