4

要创建对话框,我将覆盖以下方法:

protected Dialog onCreateDialog(final int dialogId) {
}

并调用它,我正在使用:

showDialog(id);

但现在我想使用FragmentDialog,但没有像这样的方法:

protected Dialog onCreateDialog(final int dialogId) {
    }

它有

Dialog onCreateDialog(Bundle savedInstanceState){}

我的问题是,如何根据不同的 id 显示对话框FragmentDialog

4

1 回答 1

3

我猜FragmentDialog你的意思是在 Fragment 中显示 Dialogs 而不是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
  }
}

它只是一个简单的对话框缓存

编辑:活动的原始来源:

/**
 * 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;
}
于 2012-10-10T11:43:50.633 回答