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

DialogFragment ではなくFragmentDialogFragment 内にダイアログを表示することを意味していると思います

ただし、次のように 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 に答える