在Kotlin中使用parcelable在片段之间传递对象

时间:2019-02-08 01:20:20

标签: android kotlin parcelable

您如何做到的?我有实现可拆分的对象类,但是我不知道如何将对象从一个片段发送到另一个片段。请帮助我。

2 个答案:

答案 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中的数据。 编码愉快:)