2012-12-03 20 views
5

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

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は、今の問題は、ユーザーが[はい]または[いいえ]ボタンをクリックする前に

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

が実行されたコードは、どのようにユーザーの選択肢

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

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

を記録するために使用されるクラスです私はしなければならない?

+0

現在のコードを実行しているときに「はい」または「いいえ」ボタンを押したときに得られるもの –

+0

は整数変数をグローバルにとり、その値を(0または1)に割り当て、後でその値をチェックします。 –

+1

警告ダイアログはモーダルではありません。 – Doomsknight

答えて

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; 
} 
+0

あなたの答えをありがとう。しかし、私はそれがうまくいくとは思わない。ボタンをクリックすると値を読み取るので、 – Caroline

+0

@zhouqihui正確に何を達成しようとしていますか?あなたが私達に教えることができるなら、私はコミュニティがより良い解決策を考え出すことができると思います。 –

+0

私はFunc()の戻り値を "Yes"または "No"のユーザの選択に基づいて決定したいと思います。 AlertDialogをポップアップする操作とユーザーの選択に基づいた決定の両方がFunc()にあります。 Func()では、まず何かをして結果を得た後、その結果をボタン "Yes"と "No"を持つAlertDialogでユーザに提示します。ユーザーが「はい」をクリックすると、Func()は0を返し、「いいえ」は-1を返します。 – Caroline

2

私が理解できるように、あなたのコードが

// some code 
int result = Func(); 
DoSmthWithResult(result); 
// some code 
に似ていますあなたの Funcは、UIスレッドで実行されているので、あなたがダイアログを作成した後、それは実行を継続し、 mWichの初期値を返します。代わりに onClickListenerから DoSmthWithResultを呼び出す必要があります:ユーザーは、「はい」を押すか、「いいえ」ボタンの後に今

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

DoSmthWithResultが実行されます。

+0

ありがとうございます。しかし、DoSmthWithresult(== -1?0:-1)を置くことはできません。 onClick関数では、いくつかの場所でFunc()を呼び出していたため、後の操作はこれらの場所で異なります。 – Caroline

0

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

0

私はここに確認ダイアログを表示するには、同じ機能を必要としましたが、私の回避策です:

あなたFunc()はこのように私のmessageDialog()のようにすることができます:

public static void messageDialog(Context context, String title, String bt_ok, String bt_cancel, final Runnable if_ok, final Runnable if_cancel) { 

     AlertDialog.Builder alert = new AlertDialog.Builder(context); 

     alert.setTitle(title); 

     alert.setPositiveButton(bt_ok.toUpperCase(), 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 

         if(if_ok!=null) if_ok.run(); 

        } 
       }); 
     alert.setNegativeButton(bt_cancel.toUpperCase(), 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 

         if(if_cancel!=null) if_cancel.run(); 

        } 
       }); 

     alert.show(); 

    } 

と、このようにmessageDialog()を呼び出します。

Runnable ifTrue = new Runnable() { 
     @Override 
     public void run() { 
      //put here your YES onClick stuff 
     } 
    }; 

    String msg = "Do you really want to do this?"; 

    ALITEC.Dialogs.messageDialog(this, msg, "Yes", "No", ifTrue, null); 

いいえ、私は何もしませんでした...しかし、あなたがしたい場合:その後、

Runnable ifFalse = new Runnable() { 
     @Override 
     public void run() { 
      //put here your NO onClick stuff 
     } 
    }; 

とは

messageDialog(これ、MSG、 "はい"、 "いいえ"、ifTrue、ifFalse)を呼び出します。

代わり

messageDialog(この、MSG、 "はい"、 "いいえ"、ifTrue、NULL);

すべてです。

よろしくお願いいたします。