2010-12-09 58 views
3

我認爲這很容易,但它讓我難以置信。我有一個活動,顯示一個自定義對話框,允許用戶輸入一些文本,然後確定並取消按鈕定義。我使用show()顯示它。但我無法弄清楚如何從對話框中取回數值。Android - 活動如何獲得用戶從對話框中輸入的文本

我正在使用自定義對話框,因爲它對文本條目進行了一些驗證。我想我可以改變它從Activity派生,然後使用startActivityForResult顯示它,但 - 至少基於我的舊windows編程時間 - 我認爲讓用戶從Android對話框輸入值很容易。

我可以忽略某種類型的回調或偵聽機制嗎? (1)除非它的修飾符被設置爲final,然後(2)如果我說好的使它最終,不會讓我分配它因爲「最終局部變量值不能被分配,因爲它是在一個封閉的類型定義的」

String value; 

    final EditText input = (EditText)findViewById(R.id.theText); 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setView(input); 
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() 
    { 
     public void onClick(DialogInterface dialog, int whichButton) 
     { 
      value = input.getText().toString(); 
      dialog.dismiss(); 
     } 
    }); 
    builder.show(); 

[EDIT更新的溶液] =============== =============

我最終做的主要事情是增加了將Handler傳遞給對話框的能力。在對話框類我說:

private Handler clientHandler = null; 

    public void AddHandler(Handler client) 
    { 
     this.clientHandler = client; 
    } 

並更新對話框的確定​​按鈕點擊:在活動的onCreate()顯示的對話框

/** 
    * The user pressed the OK button 
    * @param v 
    */ 
    public void okClick(View v) 
    { 
     // save the entered string 
     this.tag = this.tagEditText.getText().toString(); 

     if (null != this.clientHandler) 
     { 
     // Notify the client to update itself 
     this.clientHandler.sendMessage(clientHandler.obtainMessage()); 
     } 

     cancel(); 
    } 

然後我說:

tagDialog = new tagDialog(this); 

tagHandler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     tag = tagDialog.tag;    
    } 
}; 

tagDialog.AddHandler(tagHandler); 

回答

1

這聽起來像你想發送消息給處理程序。使用obtainMessage()獲取消息對象,然後通過消息隊列將消息發送給處理程序。

+0

這些都是很好的建議,但這是一個讓我沿着正確的道路解決我的問題的建議。我想事實證明,從我們希望的對話中獲取數據並不那麼容易。我將從我的最終解決方案發布代碼。謝謝大家 – bursk 2010-12-09 23:00:19

2

將您想要保存的東西保存在DialogonClickListener中。使用dialog.findViewById()找到您的文本框,將文本保存到某處(或使用Handler),然後在Activity中檢索保存的文本。

2

除非我在這裏錯過了一些東西,不會有靜態字符串嗎?

+0

是的,它爲我的情況。但變量必須在課堂頂部宣佈。反正有一個局部變量可以用於分配? – 2012-06-23 17:00:25