Передача объектов между фрагментами с использованием parcelable в kotlin - PullRequest
0 голосов
/ 08 февраля 2019

Как ты это делаешь?У меня есть объектный класс, реализующий parcelable, но я не знаю, что делать для отправки объекта из одного фрагмента в другой.Помогите мне, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

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

А также необходимо обрабатывать условия, такие как другой фрагмент не создан или не виден

Но с новым 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.Удачного кодирования:)

0 голосов
/ 08 февраля 2019

Вы можете использовать navGraph для обмена данными между фрагментами. Это просто.

...