2016-04-15 16 views
1

AlertDialogを作成し、ユーザーが入力した文字列を返す関数を作成したいのですが、これはダイアログを作成するための関数です。どのように値を返すのですか?あなたがの値を格納しているようAlertDialogから値を返す

String m_Text = ""; 
private String openDialog(String title) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); 
    builder.setTitle(title); 

    final EditText input = new EditText(view.getContext()); 
    input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL); 
    builder.setView(input); 

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      m_Text = input.getText().toString(); 
     } 
    }); 
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 

    builder.show(); 

// return string 
} 
+0

'return m_text'?あなたはOKハンドラで値を割り当てています...それは動作しませんか? – Krease

+0

関数がm_textを返すようにします。 – OmerN

+0

ああ、 'builder.show'はブロック関数ではありません。値が準備できるまでメソッドをブロックするか、コールバックメカニズムを使用する必要があります。 – Krease

答えて

3

解決策に進む前に、間違っていたことをいくつか説明したいと思います。

あなたのAlertDialogを表示すると、コードは実行を継続し、終了するまで待機しません(openDialog()呼び出しはAlertDialogが何かを返すのを待たずに実行を継続します)、そういうわけであなたを処理するonClickListenersコールバック(ユーザがダイアログのokボタンをクリックしたとき、または彼がそれを閉じるときに何をすべきかを表現する)。

機能的なインターフェイス(1つのメソッドを持つインターフェイス)を作成し、それを使ってコールバックを処理します(文字列などを返すようにする)。

例:

interface OnOk{ 
    void hereIsYouText (String text); 
} 

そして、あなたはのようになります方法を変更するであろう:

private void openDialog(String title, final OnOk onOk) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); 
    builder.setTitle(title); 

    final EditText input = new EditText(view.getContext()); 
    input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL); 
    builder.setView(input); 

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     //Oi, look at this line! 
     onOk.hereIsYourText(input.getText().toString()); 
    } 
}); 
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     dialog.cancel(); 
     //TODO: you should handle this event as well! 
    } 
}); 
    builder.show(); 
} 

あなたはこのようにそれを使用することができます:

openDialog("This is a title", 
      new OnOk(){ 
      @Override 
      hereIsYourText (String text){ 
       //I ll log it 
       Log.i("Texting",text); 
      }}); 

お知らせ

私はあなたのコードを完全に変更することなく非同期の方法で求めたことをどのように達成できるかを示すためにこの答えを提供しました。

0

文字列値を受け入れる同じクラスの別のメソッドを作成し、その後、あなたのsetPositiveButtonのonclickイベントから

+0

これはコールバックパターンのように聞こえるので、OPが他の例を簡単に参照できるようにする必要があります。 – Krease

0

これは私には見えますinput.getText().toString()の価値を提供し、その関数を呼び出しますm_Textフィールドに入力されたテキスト。そのフィールドを返すか、返される値を格納する関数内に変数を持たせることができます。仕事をする必要があります

return m_Text; 

:単純に置き換え

//Return string 

:あなたが持っている

+0

これは機能しません。ユーザーが[OK]をクリックする前にリターンが発生するため、空の文字列が返されます。 – OmerN

+0

あなたが求めていることは、若干異なっています。openDialogメソッドで返すことはできません。なぜなら、それはダイアログの開きだと言うからです。 ワーカースレッドでこれを実行していて、戻り値が送信されるまでスリープできない場合。 –

+0

@ExpiredData何が起きているのかを明確に知るために私の答えをチェックしてください。 – AnixPasBesoin