Как получить результат из фрагмента, используя Компонент Navigation Architecture? - PullRequest
0 голосов
/ 08 июня 2018

Допустим, у нас есть два фрагмента: MainFragment и SelectionFragment.Второй - это сборка для выбора какого-либо объекта, например, целого числа.Существуют разные подходы к получению результата из этого второго фрагмента, такие как обратные вызовы, шины и т. Д.

Теперь, если мы решим использовать компонент архитектуры навигации для перехода ко второму фрагменту, мы можем использовать этот код:

NavHostFragment.findNavController(this).navigate(R.id.action_selection, bundle)

, где bundle - это экземпляр Bundle (конечно).Как видите, нет доступа к SelectionFragment, где мы могли бы сделать обратный вызов.Вопрос в том, как получить результат с компонентом архитектуры навигации?

1 Ответ

0 голосов
/ 16 июня 2018

Согласно Google: вы должны попытаться использовать общую ViewModel .Посмотрите приведенный ниже пример из Google:

Shared ViewModel , который будет содержать общие данные и к ним можно получить доступ из разных фрагментов.

public class SharedViewModel extends ViewModel {
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }

    public LiveData<Item> getSelected() {
        return selected;
    }
}

MasterFragment, обновляющий ViewModel:

public class MasterFragment extends Fragment {

    private SharedViewModel model;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
            model.select(item);
        });
    }
}

DetailsFragment, использующий общую ViewModel:

public class DetailFragment extends Fragment {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        model.getSelected().observe(this, item -> {
           // Update the UI.
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...