要创建对话框,我将覆盖以下方法:
protected Dialog onCreateDialog(final int dialogId) {
}
并称之为,我正在使用:
showDialog(id);
但现在我想使用FragmentDialog
,但没有类似的方法:
protected Dialog onCreateDialog(final int dialogId) {
}
它有
Dialog onCreateDialog(Bundle savedInstanceState){}
我的问题是,如何根据FragmentDialog
中的不同ID显示对话框。
答案 0 :(得分:3)
我想FragmentDialog
你的意思是在片段中显示对话而不是DialogFragment
但你可以在Fragment中复制这种行为,就像这样:
class SomeFragment extends Fragment{
HashMap<Integer, Dialog> mDialogs = new HashMap<Integer, Dialog>();
public void showDialog(int dialogId){
Dialog d = mDialogs.get(dialogId);
if (d == null){
d = onCreateDialog(dialogId);
mDialogs.put(dialogId, d);
}
if (d != null){
onPrepareDialog(d, dialogId);
d.show();
}
}
public Dialog onCreateDialog(int dialogId){
//just create your Dialog here, once
}
public void onPrepareDialog(Dialog d, int dialogId){
super.onPrepareDialog(d, dialogId);
// change something inside already created Dialogs here
}
}
它只是一个简单的Dialogs缓存
编辑:活动的原始来源:
/**
* Show a dialog managed by this activity. A call to {@link #onCreateDialog(int)}
* will be made with the same id the first time this is called for a given
* id. From thereafter, the dialog will be automatically saved and restored.
*
* Each time a dialog is shown, {@link #onPrepareDialog(int, Dialog)} will
* be made to provide an opportunity to do any timely preparation.
*
* @param id The id of the managed dialog.
*
* @see Dialog
* @see #onCreateDialog(int)
* @see #onPrepareDialog(int, Dialog)
* @see #dismissDialog(int)
* @see #removeDialog(int)
*/
public final void showDialog(int id) {
if (mManagedDialogs == null) {
mManagedDialogs = new SparseArray<Dialog>();
}
Dialog dialog = mManagedDialogs.get(id);
if (dialog == null) {
dialog = createDialog(id, null);
mManagedDialogs.put(id, dialog);
}
onPrepareDialog(id, dialog);
dialog.show();
}
/**
* Provides an opportunity to prepare a managed dialog before it is being
* shown.
* <p>
* Override this if you need to update a managed dialog based on the state
* of the application each time it is shown. For example, a time picker
* dialog might want to be updated with the current time. You should call
* through to the superclass's implementation. The default implementation
* will set this Activity as the owner activity on the Dialog.
*
* @param id The id of the managed dialog.
* @param dialog The dialog.
* @see #onCreateDialog(int)
* @see #showDialog(int)
* @see #dismissDialog(int)
* @see #removeDialog(int)
*/
protected void onPrepareDialog(int id, Dialog dialog) {
dialog.setOwnerActivity(this);
}
/**
* Callback for creating dialogs that are managed (saved and restored) for you
* by the activity.
*
* If you use {@link #showDialog(int)}, the activity will call through to
* this method the first time, and hang onto it thereafter. Any dialog
* that is created by this method will automatically be saved and restored
* for you, including whether it is showing.
*
* If you would like the activity to manage the saving and restoring dialogs
* for you, you should override this method and handle any ids that are
* passed to {@link #showDialog}.
*
* If you would like an opportunity to prepare your dialog before it is shown,
* override {@link #onPrepareDialog(int, Dialog)}.
*
* @param id The id of the dialog.
* @return The dialog
*
* @see #onPrepareDialog(int, Dialog)
* @see #showDialog(int)
* @see #dismissDialog(int)
* @see #removeDialog(int)
*/
protected Dialog onCreateDialog(int id) {
return null;
}