0

Я написал следующий код в моей деятельности класса,Как получить Parcable Bundle от деятельности в Fragment

ArrayList<TXData> data; 
data= Map.getDataList(); 

Bundle bundle = new Bundle(); 
bundle.putParcelableArrayList("data",data); 

Fragment fragment = new MapsFragment(); 
fragment.setArguments(bundle); 

В MapsFragment, я написал следующий код, чтобы получить данные о onActivityCreated() метода.

ArrayList<TXData> dataList; 

dataList=getArguments().getParcelableArrayList("data"); 

Он возвращает следующее исключение из класса Фрагментов.

Вызванный: java.lang.NullPointerException: Попытка вызвать метод виртуального java.util.ArrayList android.os.Bundle.getParcelableArrayList (java.lang.String) на нуль ссылки на объект

Я добавил точки отладки, чтобы выяснить причину проблемы. Он успешно добавляет данные в Bundle от Activity, но не получает никаких данных во Фрагменте.

Просьба указать, что я делаю неправильно здесь.

РЕДАКТИРОВАТЬ Parceable Класс

public class TXData implements Serializable, Parcelable{ 

    public String id; 
    public String title; 
    public String pId = ""; 
    public float heading; 
    public float pitch; 
    public int totalCount; 
    int mData; 

    public TXSData(){ 

    } 


    protected TXData(Parcel in) { 
     id = in.readString(); 
     title = in.readString(); 
     pId = in.readString(); 
     heading = in.readFloat(); 
     pitch = in.readFloat(); 
     totalCount = in.readInt(); 
     mData = in.readInt(); 
     minPrice = in.readInt(); 
     maxPrice = in.readInt(); 
     isInFilter = in.readByte() != 0; 
     isEnabled = in.readByte() != 0; 
     totalCount = in.readInt(); 
    } 




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

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



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

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeInt(mData); 

    } 
+2

TXData Вы можете показать этот класс в теме? –

+1

У вас есть это в 'onCreateView'? –

+0

@SurajRao: Я обновил свой вопрос. @ ρяσѕρєяK: Да, onCreateView вызывается до того, как Activity onCreate завершает свою работу, поэтому он не смог добавить данные в пакет. в то время как 'onActivityCreated' успешно добавляет данные в Bundle – Kirmani88

ответ

0

Попробуйте получить объект Bundle() в onCreate() или onCreateView() фрагмента, а не onActivityCreated().

См. Пример от Fragment documentation.

0

Можете ли вы попробовать это.

ArrayList<TXData> dataList = new ArrayList<>(); 

dataList.addAll(getArguments().getParcelableArrayList("data")); 
0

Ваш метод writeToParcel является неполным. Ваш writeToParcel должен писать все свойства в том же порядке, как и в спараметрированной застройщик: protected TXSectionData(Parcel in)

Проверить здесь: tutorial

Одна очень важная вещь, чтобы обратить пристальное внимание на это порядок, что вы пишите и читайте свои значения на и из Посылки. Они должны совпадать в обоих случаях. Механизм, который Android использует для чтения Посылки, является слепым и полностью доверяет вам правильному порядку заказа, иначе вы столкнетесь с ошибками во время выполнения.

1

Простым решением было бы отказаться от Parcelable и остаться с Serializable.

public class TXData implements Serializable{ 

    public String id; 
    public String title; 
    public String pId = ""; 
    public float heading; 
    public float pitch; 
    public int totalCount; 
    int mData; 
} 

и использовать putExtra/getSerializableExtera вместо getParcelableArrayList/setParcelableArrayList

Для больших объемов данных, рекомендуется использовать Parcelable, который создан для скорости, увидеть это post или подобное ...

+0

bundle.putExtra не существует. – Kirmani88

1

Заменить ниже класс.

public class TXData implements Parcelable { 

    public String id; 
    public String title; 
    public String pId = ""; 
    public float heading; 
    public float pitch; 
    public int totalCount; 
    int mData; 

    public TXSData(){ 

    } 



    protected TXData(Parcel in) { 
     id = in.readString(); 
     title = in.readString(); 
     pId = in.readString(); 
     heading = in.readFloat(); 
     pitch = in.readFloat(); 
     totalCount = in.readInt(); 
     mData = in.readInt(); 
    } 

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

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(id); 
     dest.writeString(title); 
     dest.writeString(pId); 
     dest.writeFloat(heading); 
     dest.writeFloat(pitch); 
     dest.writeInt(totalCount); 
     dest.writeInt(mData); 
    } 

    @SuppressWarnings("unused") 
    public static final Parcelable.Creator<TXData> CREATOR = new Parcelable.Creator<TXData>() { 
     @Override 
     public TXData createFromParcel(Parcel in) { 
      return new TXData(in); 
     } 

     @Override 
     public TXData[] newArray(int size) { 
      return new TXData[size]; 
     } 
    }; 
} 
Смежные вопросы