我已經決定創建一些自定義對話框類,這些類可以在不同情況下由不同的活動使用。具體而言,我創建了一個包含單一的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。我錯過了明顯的東西嗎?這是不可能的嗎?
啊!當然!不知道爲什麼我沒有想到這一點。 –
儘管如此,對於閱讀此內容的任何人來說,在調用findViewById之前,對話框需要轉換爲Dialog對象。對話框作爲DialogInterface引用進入,findViewById未定義。 –
@Clarence Simpson很好的說明! –