2016-04-15 146 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'?你在確定處理程序中分配值...這不起作用嗎? – Krease

+0

我想函數返回m_text – OmerN

+0

啊,'builder.show'不是一個阻塞函數。您需要阻止您的方法,直到值已準備就緒或使用回調機制。 – Krease

回答

3

在進入解決方案之前,我想解釋一些您可能忽略的內容。

當你顯示你的AlertDialog時,你的代碼會一直運行,不會等待它完成(openDialog()調用繼續執行而不等待AlertDialog返回任何東西),這就是爲什麼你有onClickListeners來處理你的回調(表達當用戶點擊對話框確定按鈕或當他解除對話時你應該做什麼)。

一個乾淨的方式來實現你想要的是創建一個功能接口(一個接口有一個方法),並用它來處理你的回調(使其返回你的字符串或其他)。

例:

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

創建接受一個字符串值相同的類的另一種方法,則調用該函數提供的input.getText().toString()值從setPositiveButton onclick事件

+0

這聽起來像一個回調模式 - 值得澄清,因此OP可以輕鬆查找其他示例。 – Krease

0

這看起來像你對我已經存儲的值輸入的文本在m_Text字段中。您既可以返回該字段,也可以在存儲要返回的值的函數中包含一個變量。

如果您有:

//Return string 

簡單地更換:

return m_Text; 

應該做的工作。

+0

沒有,這將無法正常工作,它會返回一個空字符串,因爲返回發生在用戶單擊確定之前。 – OmerN

+0

在這種情況下,你所要求的稍有不同。您將無法使用openDialog方法返回,因爲正如您所說,它只是對話框的開始。 除非你在工作線程上運行它,並且可以睡眠直到發送返回值。 –

+0

@ExpiredData檢查我的答案,以清楚瞭解發生了什麼。 – AnixPasBesoin