您如何做到的?我有实现可拆分的对象类,但是我不知道如何将对象从一个片段发送到另一个片段。请帮助我。
答案 0 :(得分:0)
您可以使用navGraph在片段之间共享数据。
答案 1 :(得分:0)
在片段之间共享数据总是很痛苦,因为两个片段都需要定义相同的接口描述,并且所有者活动必须将两者绑定在一起。
还需要处理类似其他未创建或不可见的片段的情况
但是有了新的ViewModel,我们的生活就变得更容易处理片段通信了。我们要做的就是使用活动范围创建通用的ViewModel来处理通信。
让我们举个例子,在一个片段中,我们需要显示新闻报道的列表,而在另一个片段中,我们需要显示所选新闻报道的详细信息。
步骤1:-创建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;
}
}
步骤2:-创建一个包含对象的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
});
}
}
如果您观察到,两个片段在获取ViewModelProviders时都使用getActivity()。意味着两个片段都接收相同的ArticleViewModel实例,该实例的作用范围是您的父Activity。
就这么简单,我们会得到更多类似的好处
您的活动无需担心此交流 即使一个片段被销毁,另一片段也使用ViewModel中的数据。 编码愉快:)