2011-08-15 43 views
3

我已經決定創建一些自定義對話框類,這些類可以在不同情況下由不同的活動使用。具體而言,我創建了一個包含單一的EditText框,這樣一個標題對話框:如何從通用對話框類中獲取數據

public class EditTextDialogFragment extends DialogFragment { 

    // Factory method to create a new EditTextDialogFragment 
    public static EditTextDialogFragment newInstance(int title, int defaultText) { 
     EditTextDialogFragment frag = new EditTextDialogFragment(); 
     Bundle args = new Bundle(); 
     args.putInt("title", title); 
     args.putInt("defaultText", defaultText); 
     frag.setArguments(args); 
     return frag; 
    } 

    // Set title and default text 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Set an EditText view to get user input 
     EditText inputView = new EditText(getActivity()); 
     inputView.setHint(getArguments().getInt("defaultText")); 

     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) 
     .setIcon(android.R.drawable.ic_dialog_alert) 
     .setTitle(getArguments().getInt("title")) 
     .setPositiveButton(R.string.ok, (DialogInterface.OnClickListener)getActivity()) 
     .setNegativeButton(R.string.cancel, (DialogInterface.OnClickListener)getActivity()) 
     .setView(inputView); 

     return builder.create(); 
    } 
} 

還請注意,我這樣做是使用DialogFragments在最近的Android SDK建議。

不管怎麼說,這個想法是,從任何活動我能做出這樣的呼籲:

 EditTextDialogFragment etdf = EditTextDialogFragment.newInstance(R.string.add_new_term, R.string.term_name); 
     etdf.show(getSupportFragmentManager(), "new_term"); 

而且只要我在活動實施DialogInterface.OnClickListener,我會得到一個回調時用戶完成對話框。所以,我有我的活動這種方法:

@Override 
public void onClick(DialogInterface dialog, int whichButton) { 

    if (whichButton == DialogInterface.BUTTON_POSITIVE) { 
     Toast.makeText(getApplicationContext(), "Dialog finished!", Toast.LENGTH_SHORT).show(); 
    } 
} 

我已經使用這個完全一樣的設計,一個是/否對話框,它真是棒極了,我喜歡它。只需兩行代碼,我就可以輕鬆地從任何活動中調用它,並顯示帶有定製標題的「是/否」對話框。然後,onClick回調包含哪個按鈕被按下,所以我需要從對話框中獲得所有信息。

但是,對於此EditText對話框,我無法弄清楚如何從OnClick方法內的EditText框中獲取數據。傳回的唯一東西是按下按鈕和一個DialogInterface引用(據我所知,並不能幫助我獲得EditText數據)。

我見過的唯一的解決方案涉及嵌入建設者這樣的代碼裏面的OnClickListener代碼:

builder.setItems(terms, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Toast.makeText(getApplicationContext(), inputView.getText().toString(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 

但失敗創建可以從需要的任何活動中使用的通用對話框類的全部目的一個EditBox。我錯過了明顯的東西嗎?這是不可能的嗎?

回答

5

這是一個非常常見的問題,實際上有一個非常簡單的解決方案。你只需要使用新的對話框作爲視圖來抓取控件。

事情是這樣的..

EditText editTextFromDialog = (EditText)dialog.findViewById(the_editText_ID); 

然後在你的onclick處理程序,只要你是在作用域聲明的控制(如果沒有,你將不得不修改範圍,以滿足您的需求,您可以只要抓住內容

String dialogInput = editTextFromDialog.getText().toString(); 
+0

啊!當然!不知道爲什麼我沒有想到這一點。 –

+4

儘管如此,對於閱讀此內容的任何人來說,在調用findViewById之前,對話框需要轉換爲Dialog對象。對話框作爲DialogInterface引用進入,findViewById未定義。 –

+0

@Clarence Simpson很好的說明! –

0

優秀,

我實現的onclick方法的活動,它的工作原理:

public class MainActivity extends FragmentActivity implements OnClickListener { 

    protected void button1ActionPerformed() { 
     // TODO Auto-generated method stub 
     newFragment = new InputDialogFragment().newInstance(R.string.send_trasnsactions, R.string.dialog_fire_missiles, R.string.dialog_fire_missiles); 
     newFragment.show(getSupportFragmentManager(), "missiles"); 

    } 

@Override 
    public void onClick(DialogInterface dialog, int whichButton) { 
     Dialog x = (Dialog)dialog; 
     EditText editTextFromDialog = (EditText)x.findViewById(2000); 
     if (whichButton == DialogInterface.BUTTON_POSITIVE) { 
      Log.i("x:"+editTextFromDialog.getText().toString(), "Ok"); 
     }else{ 
      Log.i("x", "cancel"); 
     } 
    } 

} 
相關問題