Показать DialogFragment из другого DialogFragment

У меня есть DialogFragment, который отображает список параметров для пользователя, одним из этих параметров является параметр «Удалить», когда пользователь нажимает параметр удаления, я хочу показать другой DialogFragment в качестве подтверждения, к сожалению, диалоговое окно подтверждения не отображается .

вот мой код

Код первого фрагмента

public class ContactDialogOption extends SherlockDialogFragment {

    public static final String TAG = ContactDialogOption.class.getSimpleName();

    public ContactDialogOption() {
        super();
        // TODO Auto-generated constructor stub
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        builder.setIcon(R.drawable.ic_launcher);
        builder.setTitle(R.string.options);

        builder.setItems(new String[] {

        getString(R.string.call), getString(R.string.send_message),
                getString(R.string.copy), getString(R.string.edit),
                getString(R.string.delete)

        }, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                          if(which == 4) //delete
                          {
FragmentManager mgr = getActivity().getSupportFragmentManager();
    FragmentTransaction ft = mgr.beginTransaction();
        Fragment old = mgr.findFragmentByTag("SecondFragment");
        if (old != null) {
            ft.remove(old);
        }
        ft.addToBackStack(null);


fragment.show(ft, fragmentTag);
                          }
            }
        });

        return builder.create();
    }
}

person user4o01    schedule 14.05.2013    source источник
comment
кажется, я не могу показать DialogFragment из метода onClick !!!   -  person user4o01    schedule 14.05.2013
comment
где вы создаете экземпляр второго фрагмента, который хотите показать?   -  person Cristian Chereches    schedule 31.05.2013


Ответы (9)


У меня точно такая же проблема, такой ситуации не происходит, когда вы пытаетесь открыть DialogFragment из Fragment.

Единственное решение, которое я нашел, состояло в том, чтобы изменить следующий вызов:

fragment.show(ft, fragmentTag);

To:

fragment.show(getFragmentManager(), fragmentTag);

Проблема с этим решением в том, что мы не можем работать с FragmentTransition.

Я не понимаю, почему поведение отличается от фрагментов.

person Yoann Hercouet    schedule 20.04.2016

Я столкнулся с той же проблемой, когда не смог показать другой DialogFragment из прослушивателей положительных и отрицательных кликов первого DialogFragment. Мое решение состояло в том, чтобы немедленно вытолкнуть первый фрагмент, что позволяет успешно прикрепить и отобразить второй DialogFragment.

// Call this before adding the second dialog fragment activity.getSupportFragmentManager().popBackStackImmediate();

person Theo    schedule 23.05.2016

Пожалуйста, проверьте следующий код. Надеюсь, это поможет многим из вас!

public class SubcategoryFragment extends DialogFragment {

public SubcategoryFragment() {

}

public static SubcategoryFragment newInstance(Integer code, String name) {
    SubcategoryFragment fragment = new SubcategoryFragment();

    mCode = code;
    mTitle = name;
    return fragment;
}


@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    liststring = new ArrayList<>();

    getAdapter();

}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_subcategory, container, false);
    gridView = (GridView) view.findViewById(R.id.sub_grid);


    return view;

}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    closeDialog = (ImageView) getDialog().findViewById(R.id.closeDialog);
    title = (TextView) getDialog().findViewById(R.id.dialogTitle);
    gridView = (GridView) getDialog().findViewById(R.id.sub_grid);

    title.setText(String.format("Choose %s", mTitle));
    closeDialog.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getDialog().dismiss();
        }
    });


}

@Override
public Dialog onCreateDialog(@NonNull Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);


    // request a window without the title
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

    //  closeDialog = (ImageView) dialog.findViewById(R.id.closeDialog);

    return dialog;

}



public void getAdapter() {

        gridAdapter = new HomeSubGridViewAdapter(getContext(), R.layout.gridview_custom_layout, liststring);
        gridView.setAdapter(gridAdapter);

}


}

Это метод вызова диалога из фрагмента

  fragmentManager = ((FragmentActivity) context).getSupportFragmentManager();
                    SubcategoryFragment postalFragment = SubcategoryFragment.newInstance(Integer.valueOf(item.getId()), item.getName());
                    postalFragment.show(fragmentManager, "SubcategoryFragment");

Не стесняйтесь спрашивать, чувствуете ли вы какую-либо проблему в том, что

person AMAN SINGH    schedule 31.10.2016

Совсем недавно у меня была эта проблема, и ни один из вышеперечисленных вариантов не работал для меня. Я попытался использовать метод ниже:

DialogFragment fragment = new MyFragment(); //where MyFragment is my fragment I want to show
fragment.setCancelable(true);
fragment.show(getSupportFragmentManager(), "timePicker");

Это будет ТОЛЬКО работать, если вы используете это в действии (например, для вызова фрагмента диалога из класса действия).

Однако я исправил это, понизив экземпляр своего действия до действия AppCompat и используя его для вызова getSupportFragment(), как показано ниже:

DialogFragment timeFragment = new TimePicker();
timeFragment.setCancelable(true);
AppCompatActivity activity = (AppCompatActivity) getActivity();
timeFragment.show(activity.getSupportFragmentManager(), "timePicker");

Я надеюсь, что это поможет .. Веселого кодирования!

person Taslim Oseni    schedule 28.02.2018

Вы можете вызвать DialogFragment из Другого DialogFragment.

NewDialogFragment newDialogFragment= new NewDialogFragment();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
newDialogFragment.show(transaction, "New_Dialog_Fragment");
person Hasib Akter    schedule 12.09.2019

Это код, который работает для меня:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    if (getArguments() == null) {
        throw new InvalidParameterException("The key types dialog needs the protocol id to be in the arguments");
    }
    if (mCallback == null) {
        throw new InvalidParameterException("The key types dialog needs an callback to be set");
    }

    mProtocolId = getArguments().getInt(ApplicationConstants.FragmentsConstants.PROTOCOL_ID);
    final List<KeyTypeEntity> allKeyTypes = BusinessFacade.getInstance(getActivity()).KeyTypeLogic.getAllKeyTypes();

    ArrayAdapter<KeyTypeEntity> keyTypeAdapter = new ArrayAdapter<KeyTypeEntity>(getActivity(), android.R.layout.simple_list_item_1, allKeyTypes);

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    builder.setTitle("").setAdapter(keyTypeAdapter, new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            final KeyTypeEntity keyTypeEntity = allKeyTypes.get(which);
            AlertDialog.Builder number = new AlertDialog.Builder(getActivity());

            List<String> keyNumbers = new ArrayList<String>();

            for (int i = 0; i < 50; i++) {
                keyNumbers.add("" + (i + 1));
            }
            ArrayAdapter<String> kAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, keyNumbers);

            number.setTitle("").setAdapter(kAdapter, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    addNewKey(keyTypeEntity, which + 1);
                }
            });
            number.show();
        }
    }).setOnCancelListener(new OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            mCallback.onDialogClosed();
        }
    });

    mDialog = builder.create();
    return mDialog;
}

В обработчике первого клика я просто создаю новый диалог и показываю его. Это закроет первое диалоговое окно, откроет второе, и когда пользователь щелкнет элемент в списке, будет вызван второй обработчик щелчка.

Надеюсь, это поможет, и я не опоздал :)

person Cristian Chereches    schedule 31.05.2013
comment
Я действительно не понимаю ... зачем публиковать тонну кода из вашего проекта, который не имеет ничего общего с вопросом? Это просто сбивает с толку новичков - person egorikem; 24.04.2017

Вы можете передать FragmentManage в newInstance() метод First DialogFragment, затем вы можете использовать его, чтобы показать новый dialogfragment это мой код.

private static FragmentManager fragmentManager;

public static PlayListDialog newInstance(Context context,  FragmentManager fragmentManager1) {
    playListDialog = new PlayListDialog();
    mContext = context;
    fragmentManager = fragmentManager1;
    return playListDialog;
}

@Override
public void createNewPlaylist() {
    NewPlayListDialog newPlayListDialog = NewPlayListDialog.newInstance(mContext);
    newPlayListDialog.showDialog(fragmentManager.beginTransaction(),fragmentManager.findFragmentByTag("newdialog"));
}
person HUNG TRAN DUY    schedule 07.11.2017

Использовать это:

getActivity().getSupportFragmentManager

вместо

getChildFragmentManager().

Надеюсь это поможет.

person Ouazza Mustapha    schedule 22.09.2019

Если вы хотите версию kotlin, используйте это:

val newDialogFragment = NewDialogFragment()
val transaction: FragmentTransaction = 
requireActivity().supportFragmentManager.beginTransaction()
newDialogFragment.show(transaction, "New_Dialog_Fragment")
person Cyd    schedule 29.03.2020