Как отправить ArrayList <Object>другому Фрагменту / Деятельности без инициализации (запуска) следующей Деятельности? - PullRequest
0 голосов
/ 16 января 2020

У меня есть ArrayList, и мне нужно отправить его в другой фрагмент. Я пытался использовать Parcelable, но для отправки данных мне нужен метод "startIntent", который запускает фрагмент. Я не хочу, чтобы фрагмент запускался.

Мне нужно отправить объект списка массивов данных другому фрагменту без перехода к этому другому фрагменту. Мне нужно только отправить данные. Пользователь может свободно выбирать, когда переключаться между действиями / фрагментами. И данные, отправленные ранее, уже должны быть там.

Пример использования Parcelable:

Класс, который должен быть отправлен:

import android.os.Parcel;
import android.os.Parcelable;

public class Doenca implements Parcelable {

    private String nome;
    private String causa;
    private String efeito;
    private String cuidados;
    private String prevencao;
    private String categoria;

    public Doenca(String nome, String causa, String efeito, String cuidados, String prevencao, String categoria) {
        this.nome = nome;
        this.causa = causa;
        this.efeito = efeito;
        this.cuidados = cuidados;
        this.prevencao = prevencao;
        this.categoria = categoria;
    }

    protected Doenca(Parcel in) {
        nome = in.readString();
        causa = in.readString();
        efeito = in.readString();
        cuidados = in.readString();
        prevencao = in.readString();
        categoria = in.readString();
    }

    public static final Creator<Doenca> CREATOR = new Creator<Doenca>() {
        @Override
        public Doenca createFromParcel(Parcel in) {
            return new Doenca(in);
        }

        @Override
        public Doenca[] newArray(int size) {
            return new Doenca[size];
        }
    };

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCausa() {
        return causa;
    }

    public void setCausa(String causa) {
        this.causa = causa;
    }

    public String getEfeito() {
        return efeito;
    }

    public void setEfeito(String efeito) {
        this.efeito = efeito;
    }

    public String getCuidados() {
        return cuidados;
    }

    public void setCuidados(String cuidados) {
        this.cuidados = cuidados;
    }

    public String getPrevencao() {
        return prevencao;
    }

    public void setPrevencao(String prevencao) {
        this.prevencao = prevencao;
    }

    public String getCategoria() {
        return categoria;
    }

    public void setCategoria(String categoria) {
        this.categoria = categoria;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(nome);
        dest.writeString(causa);
        dest.writeString(efeito);
        dest.writeString(cuidados);
        dest.writeString(prevencao);
        dest.writeString(categoria);
    }
}


import android.os.Parcel;
import android.os.Parcelable;

public class Doenca implements Parcelable {

    private String nome;
    private String causa;
    private String efeito;
    private String cuidados;
    private String prevencao;
    private String categoria;

    public Doenca(String nome, String causa, String efeito, String cuidados, String prevencao, String categoria) {
        this.nome = nome;
        this.causa = causa;
        this.efeito = efeito;
        this.cuidados = cuidados;
        this.prevencao = prevencao;
        this.categoria = categoria;
    }

    protected Doenca(Parcel in) {
        nome = in.readString();
        causa = in.readString();
        efeito = in.readString();
        cuidados = in.readString();
        prevencao = in.readString();
        categoria = in.readString();
    }

    public static final Creator<Doenca> CREATOR = new Creator<Doenca>() {
        @Override
        public Doenca createFromParcel(Parcel in) {
            return new Doenca(in);
        }

        @Override
        public Doenca[] newArray(int size) {
            return new Doenca[size];
        }
    };

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCausa() {
        return causa;
    }

    public void setCausa(String causa) {
        this.causa = causa;
    }

    public String getEfeito() {
        return efeito;
    }

    public void setEfeito(String efeito) {
        this.efeito = efeito;
    }

    public String getCuidados() {
        return cuidados;
    }

    public void setCuidados(String cuidados) {
        this.cuidados = cuidados;
    }

    public String getPrevencao() {
        return prevencao;
    }

    public void setPrevencao(String prevencao) {
        this.prevencao = prevencao;
    }

    public String getCategoria() {
        return categoria;
    }

    public void setCategoria(String categoria) {
        this.categoria = categoria;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(nome);
        dest.writeString(causa);
        dest.writeString(efeito);
        dest.writeString(cuidados);
        dest.writeString(prevencao);
        dest.writeString(categoria);
    }
}

Ответы [ 2 ]

1 голос
/ 16 января 2020

Попробуйте использовать EventBus.

Чтобы использовать EventBus , вам необходимо сначала добавить его в модуль приложения build.gradle file

    implementation 'org.greenrobot:eventbus:3.1.1'

и затем syn c вашего проекта.

Подписчик события

Подписчик просто подписывается на событие, зарегистрировавшись в шине событий, а также может отменить регистрацию этого события. Чтобы стать подписчиком, вы должны сделать три основных действия:

  1. Зарегистрировать подписчика в шине событий с помощью register () . Это сообщает шине событий, что вы хотите начать получать события. В действии это происходит в методе onStart () , а во фрагменте помещается в метод onAttact (Activity Activity) .

    @Override
    public void onStart() {
       super.onStart();
       EventBus.getDefault().register(this);
         }
    
  2. Отмените регистрацию подписчика, что означает, что шина событий перестает отправлять мне события. В действии это происходит в методе onStop () , а во фрагменте помещается в метод onDetach () .

        @Override
         public void onStop() {
            super.onStop();
           EventBus.getDefault().unregister(this);
             }
    
  3. Реализуйте onEvent () , чтобы указать тип события, которое вы хотите получить, и действие, которое нужно предпринять при получении события. Обратите внимание на аннотацию @ Subscribe в верхней части этого метода.

    @Subscribe
    public void onEvent(MessageEvent event) {
    Toast.makeText(this, "Hey, my message" + event.getMessage(), 
       Toast.LENGTH_SHORT).show();.
               }
    

Определение сообщений о событиях

События в Greenrobot EventBus являются просто объектами что вы определяете. Вы можете иметь разные классы событий, если хотите. Они не наследуют какой-либо базовый класс или интерфейс - они просто POJO (простые старые Java объекты).

      public class MessageEvent {
        public final List<SomeItem> items;
        public MessageEvent(List<SomeItem> items) {
          this.items= items;
              }
               }

Post Event

EventBus.getDefault().post(new MessageEvent("Hey event subscriber!"));
1 голос
/ 16 января 2020

Существует несколько способов с различной сложностью для реализации.

  1. Использование базы данных для хранения того, что вам нужно
  2. Сохранение данных в активности хоста, содержащей вкладки. Как только вы переключите фрагмент, все, что вам нужно сделать, это прочитать данные из того места, где вы их сохранили.
  3. Использовать LiveData . LiveData будет моим личным предпочтением. Там вы можете легко хранить любые данные, которые вам нужны, а второй фрагмент просто наблюдает за данными и легко реагирует на изменения. Таким образом, вы можете переключаться в обоих направлениях так часто, как хотите.
...