Совместное использование данных между фрагментами всегда болезненно, поскольку оба фрагмента должны определять одно и то же описание интерфейса, а действие владельца должно связывать два вместе.
А также необходимо обрабатывать условия, такие как другой фрагмент не создан или не виден
Но с новым ViewModel наша жизнь становится проще для общения с фрагментами.Все, что нам нужно сделать, это просто создать общую ViewModel, используя область действия для обработки связи.
Давайте рассмотрим пример, где, как в одном фрагменте, нам нужно показать список новостных статей, а в другом - как подробностивыбранная новостная статья.
Step1: - Создайте класс модели Article.
public class Article {
private int articleID;
private String articleName;
private String details;
public int getArticleID() {
return articleID;
}
public void setArticleID(int articleID) {
this.articleID = articleID;
}
public String getArticleName() {
return articleName;
}
public void setArticleName(String articleName) {
this.articleName = articleName;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
}
Step2: - Создайте ArticleViewModel, который содержит объекты.
public class ArticleViewModel extends ViewModel {
private LiveData<List<Article>> articleList;
private final MutableLiveData<Article> selectedArticle = new MutableLiveData<Article>();
public MutableLiveData<Article> getSelectedArticle() {
return selectedArticle;
}
public void setSelectedArticle(Article article) {
selectedArticle.setValue(article);
}
public LiveData<List<Article>> getArticleList() {
return articleList;
}
public void loadArticles() {
// fetch articles here asynchronously
}
}
Step3:- Create a ArticleListFragment which take care of your list.
public class ArticleListFragment extends Fragment {
private SharedViewModel model;
public void onActivityCreated() {
ArticleViewModel model = ViewModelProviders.of(getActivity()).get(ArticleViewModel.class);
listItemSelector.setOnClickListener(article -> {
model.setSelectedArticle(article);
});
}
}
Step4: - Создайте свой ArticleDetailFragment, чтобы показать детали статьи
public class ArticleDetailFragment extends LifecycleFragment {
public void onActivityCreated() {
ArticleViewModel model = ViewModelProviders.of(getActivity()).get(ArticleViewModel.class);
model.getSelectedArticle().observe(this, { article ->
// update UI
});
}
}
Если вы заметили, оба фрагмента используют getActivity () при получении ViewModelProviders.Означает, что оба фрагмента получают один и тот же экземпляр ArticleViewModel, который находится в области действия вашего родительского действия.
Это просто, и мы получаем больше преимуществ, таких как
Ваша активность, не нужно беспокоиться об этом общении. Даже один фрагментуничтожить, другой использовать данные в ViewModel.Удачного кодирования:)