Как установить целевой фрагмент диалога при использовании компонентов навигации - PullRequest
0 голосов
/ 08 июня 2018

Я показываю диалог внутри фрагмента, используя childFragmentManager или в Деятельности, используя supportFragmentManager, в процессе я хотел бы установить целевой фрагмент, например:

val textSearchDialog = TextSearchDialogFragment.newInstance()
textSearchDialog.setTargetFragment(PlaceSearchFragment@this, 0)

Но при запуске этого кода я получаю ошибку:

java.lang.IllegalStateException: Fragment TextSearchDialogFragment {b7fce67 # 0 0} объявленный целевой фрагмент PlaceSearchFragment {f87414 # 0 id = 0x7f080078}, который не принадлежитэтот FragmentManager!

Я не знаю, как получить доступ к FragmentManager, используемому компонентами навигации для управления отображением фрагмента, есть ли решение для этого?

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Чтобы уточнить принятый ответ:

(1) Создайте модель общего представления, которая будет использоваться для обмена данными между фрагментами в рамках этого действия.

public class SharedViewModel extends ViewModel {

    private final MutableLiveData<Double> aDouble = new MutableLiveData<>();

    public void setDouble(Double aDouble) {
        this.aDouble.setValue(aDouble);
    }

    public LiveData<Double> getDouble() {
        return aDouble;
    }
}

(2) Storeданные, которые вы хотели бы получить в представлении модели.Обратите внимание на область действия модели представления (getActivity).

SharedViewModel svm =ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
svm.setDouble(someDouble);

(3) Пусть фрагмент реализует интерфейс обратного вызова диалога и загружает диалоговое окно без установки целевого фрагмента.

fragment.setOnDialogSubmitListener(this);
fragment.show(getActivity().getSupportFragmentManager(), TAG);

(4) Внутри диалогового окна извлеките данные.

SharedViewModel svm =ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
svm.getDouble().observe(this, new Observer<Double>() {
    @Override
    public void onChanged(Double aDouble) {
        // do what ever with aDouble
    }
}); 
0 голосов
/ 08 июня 2018

Рекомендуемый шаблон для связи между фрагментами с компонентами архитектуры навигации - через shared ViewModel - ViewModel, который живет на уровне активности, достигнутом путем получения ViewModel с использованием ViewModelProviders.of(getActivity())

Согласно документации , это дает ряд преимуществ:

  • Деятельности не нужно ничего делать или знать что-либо об этомобщение.
  • Фрагменты не должны знать друг о друге, кроме SharedViewModel контракта.Если один из фрагментов исчезает, другой продолжает работать как обычно.
  • Каждый фрагмент имеет свой собственный жизненный цикл, и на него не влияет жизненный цикл другого.Если один фрагмент заменяет другой, пользовательский интерфейс продолжает работать без проблем.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...