DialogFragment не отображается в слушателе - PullRequest
0 голосов
/ 25 апреля 2018

Я знаю, что есть один вопрос с таким же названием, но мой сценарий немного сложен. Во FragmentA один раз, нажав кнопку, начнется новое действие, чтобы показать FragmentB, если затем нажать одну кнопку во FragmentB, мне нужно закрыть FragmentB, вернуться к FragmentA и показать DialogFragmentC. То, что я делаю, это определить один слушатель во FragmentB и реализовать его во FragmentA.

Пример кода приведен ниже:

class FragmentA extends Fragment implements FragmentBDelegate {
    .......
    @Override
    public void onButtonClicked() {
        DialogFragment popup = new DialogFragmentC();
        popup.show(((AppCompatActivity)getContext()).getSupportFragmentManager(), null);
    }
    ......
}

class FragmentB extends Fragment{
    ......
    private void onButtonClicked(View v) {
        getActivity().finish();// to dismiss current activity
        if(mListener != null) {
            mListener.onButtonClicked();
        }
    }

    public interface FragmentBDelegate {
        void onButtonClicked();
    }

    ......
}

Почему DialogFragment не отображается? Если слушатель не может выполнить это требование, как реализовать?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

@ Комментарий ADM ведет меня к одному обходному пути. Я определяю один showWithStateLoss() метод с commitAllowingStateLoss() для фиксации FragmentTransaction в DialogFragmentC. Тогда это работает.

public void showWithStateLoss(FragmentManager manager, String tag) {
    FragmentTransaction ft = manager.beginTransaction();
    ft.add(this, tag);
    ft.commitAllowingStateLoss(); //original it's commit()
}
0 голосов
/ 25 апреля 2018

Вы не должны (возможно, можете, но не должны) использовать метод обратного вызова между различными действиями.

Если это именно то, что вам нужно сделать, вам нужно начать второе действие для результата с startActivityForResult(). Затем решите, хотите ли вы показывать диалог на основе результатов 2-го упражнения. FragmentB будет устанавливать результат, а не пытаться вызвать обратный вызов 1-го действия.

...