Открытие фрагмента из DialogFragment (замена родительского диалога)

Допустим, у меня есть фрагмент A, из которого я открываю DialogFragment вот так:

FragmentActivity fragmentActivity = (FragmentActivity) view.getContext();
FragmentTransaction ft = fragmentActivity.getSupportFragmentManager().beginTransaction();
Fragment prev = fragmentActivity.getSupportFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
  ft.remove(prev);
}
ft.addToBackStack(null);
DialogFragment fragmentDialog = MyDialogFragment.newInstance();
fragmentDialog.show(ft, "dialog");

В этом диалоговом окне после нажатия кнопки (положительная/нейтральная/отрицательная) я хочу открыть фрагмент B, который должен заменить фрагмент A.

В методе диалогового окна onClick я запускаю метод обратного вызова родительской активности:

@Override
public void onClick(DialogInterface dialog, int which) {
  switch(which) {
    case DialogInterface.BUTTON_NEUTRAL:
      detailsCallbacks.openMoreDetails(); 
      break;
  }
}

И, наконец, мой метод Activity openMoreDetails() выглядит так:

@Override
public void openMoreDetails() {
  Fragment fragmentB = Fragment.newInstance();
  FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
  ft.replace(R.id.fragment_container, fragmentB);
  ft.addToBackStack(null);
  ft.commit();
}

То, что я получаю, странно. Фрагмент B мигает на экране всего лишь долю секунды, а затем снова заменяется (закрывается?) Фрагментом A.

Когда я нажимаю кнопку «вверх», я возвращаюсь даже из фрагмента A, поэтому ни одна из этих транзакций не была добавлена ​​​​в задний стек. Я хотел бы показать фрагмент B, а затем, нажав кнопку вверх, вернуться к фрагменту A.

Это как-то возможно? А что не так в моем подходе?


person Marcel Bro    schedule 01.02.2013    source источник


Ответы (3)


Только что была такая же проблема:

Фрагмент A отображает пользовательский фрагмент диалога.

При нажатии на одну из кнопок фрагмента диалога я хотел убрать диалог и показать Фрагмент B.

Фрагмент B отображался и мгновенно исчезал. На моем экране снова отображался фрагмент А.

Что было неправильным в моей первоначальной реализации:

private void onClickInscription() {
    FragmentInscription frag = FragmentInscription.newInstance();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.main, frag);
    ft.addToBackStack(null);
    ft.commit();
    dismiss();
}

И правильный вариант:

private void onClickInscription() {
    dismiss();
    FragmentInscription frag = FragmentInscription.newInstance();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.main, frag);
    ft.addToBackStack(null);
    ft.commit();
}

Поэтому попробуйте сначала вызвать отклонение в своем диалоговом окне, а затем примените FragmentTransction

person ol_v_er    schedule 22.06.2013

Я знаю, что прошло много времени с тех пор, как проблема была опубликована, но я решил ее, добавив if(fragmentB.getView != null) перед оператором замены.

Это, наконец, не делает вспышку и исчезает. (:

person Prash    schedule 13.03.2019

Вы не должны открывать диалог из FragmentA. Реализуйте обратный вызов из вашего FragmentA в вашу активность и позвольте ей обрабатывать все транзакции фрагментов.

person ezcoding    schedule 01.02.2013
comment
Он по-прежнему просто мигает сразу после появления Фрагмента А. При нажатии назад / вверх я получаю то же действие, что и при нажатии назад / вверх из фрагмента A, поэтому фрагмент B не отображался (более половины секунды) и не добавлялся в задний стек. - person Marcel Bro; 01.02.2013
comment
Я перестроил концепцию без проблем... попробуйте использовать FragmentActivity fragmentActivity = getActivity(); вместо того, что вы делаете: FragmentActivity fragmentActivity = (FragmentActivity) view.getContext(); - person ezcoding; 01.02.2013
comment
Но я должен добавить, что я использовал другой подход, чем вы. Всякий раз, когда я вызываю другой Fragment. Я помещаю код в действие фрагмента и позволяю ему обрабатывать транзакции. Я думаю, что это более чистое кодирование, поскольку фрагменты не должны вызывать или удалять друг друга. Это работа Activites. - person ezcoding; 01.02.2013
comment
Да, ваш подход определенно чище моего. Я изменю это во всем своем приложении. Однако это не решило проблему. Странно то, что Фрагмент B фактически появляется на долю секунды, а затем снова заменяется Фрагментом A. - person Marcel Bro; 03.02.2013
comment
Что произойдет, если вы удалите эту строку Fragment prev = fragmentActivity.getSupportFragmentManager().findFragmentByTag("dialog"); if (prev != null) { ft.remove(prev); } - person ezcoding; 04.02.2013