У меня есть 2 объекта, которые будут разделены между различными действиями в моем приложении, Пользователем и Аккаунтом.Оба они реализуют Parcelable.User, хранящий массив объектов Account, называемый userAccounts, который предназначен для переноса между действиями, однако массив не переносится между действиями, он приходит с 0 объектами, даже если он был заполнен в источнике.активность (я уже проверил это).Другие пользовательские переменные передаются правильно, поэтому я знаю, что это, вероятно, не является проблемой в реализации Parcelable.
Я пытался реализовать следующие методы Parcelable
Методы записи
writeArray ();writeTypedArray ();
Методы чтения
readArray ();readTypedArray ();
В дополнение к этому я проверил, что массив заполнен, и методы getters и setters в моем объекте доступны правильно. Ниже приведен код для объектов, реализующих User и Account
public class Account implements Parcelable {
private String type;
private String name;
private int amount;
public Account(String type, String name, int amount){
this.type=type;
this.name=name;
this.amount=amount;
}
public String getType(){
return type;
}
public String getName(){
return name;
}
public int getAmount(){
return amount;
}
//Parcelable methods
public void writeToParcel(Parcel dest, int flags){
dest.writeString(type);
dest.writeString(name);
dest.writeInt(amount);
}
//Parcelable constructor
public Account(Parcel parcel){
type=parcel.readString();
name=parcel.readString();
amount=parcel.readInt();
}
public static final Parcelable.Creator<Account> CREATOR= new Parcelable.Creator<Account>(){
@Override
public Account createFromParcel(Parcel parcel){
return new Account(parcel);
}
@Override
public Account [] newArray(int size){
return new Account[size];
}
};
public int describeContents(){
return hashCode();
}
}
public class User implements Parcelable{
private String email_address;
private String user_name;
private String password;
private int totalIncome=0;
private int balance=0;
private int totalExpense=0;
private ArrayList<Account> userAccounts = new ArrayList<>();
private Account[] accountArray=new Account[userAccounts.size()];
public User(String email_address,String user_name,String password){
this.email_address=email_address;
this.user_name=user_name;
this.password=password;
}
//method for the user to create accounts
public void createAccount(String type,String name, int amount){
Account new_account= new Account(type,name,amount);
userAccounts.add(new_account);
if (new_account.getType().equals("Income")){
totalIncome=totalIncome+new_account.getAmount();
}
else if (new_account.getType().equals("Expense")){
totalExpense=totalExpense+new_account.getAmount();
}
}
//Calculates the balance of all the accounts
public int calculateBalance (){
balance=totalIncome-totalExpense;
return balance;
}
//getters
public String getTotalIncome(){
return Integer.toString(totalIncome);
}
public String getTotalExpense(){
return Integer.toString(totalExpense);
}
public String getBalance(){
return Integer.toString(balance);
}
public String getEmailAddress(){
return email_address;
}
public String getUserName(){
return user_name;
}
public String getPassword(){
return password;
}
public Account[] getAccounts(){
accountArray=this.convertToArray();
System.out.println("Accounts accesed");
System.out.println("accountArray size "+accountArray.length);
return accountArray;
}
//setters
public void setTotalIncome(int totalIncome){
this.totalIncome=totalIncome;
}
public void setTotalExpense(int totalExpense){
this.totalExpense=totalExpense;
}
public void setAccounts(Account[] accounts){
this.userAccounts=new ArrayList<Account>(Arrays.asList(accounts));
}
public void setBalance(int balance){
this.balance=balance;
}
//Parcelable methods
//Converts userAccounts to Array for parcelable
public Account[] convertToArray(){
accountArray=userAccounts.toArray(new Account[userAccounts.size()]);
return accountArray;
}
//Write object values to parcel for storage
public void writeToParcel(Parcel parcel, int flags){
parcel.writeString(email_address);
parcel.writeString(user_name);
parcel.writeString(password);
parcel.writeInt(totalIncome);
parcel.writeInt(balance);
parcel.writeInt(totalExpense);
parcel.writeTypedArray(accountArray,0);
}
//Parcel constructor
public User(Parcel parcel){
email_address=parcel.readString();
user_name=parcel.readString();
password=parcel.readString();
totalIncome=parcel.readInt();
balance=parcel.readInt();
totalExpense=parcel.readInt();
accountArray=parcel.createTypedArray(Account.CREATOR);
}
//Parcel creator
public static final Parcelable.Creator<User> CREATOR=new Parcelable.Creator<User>(){
@Override
public User createFromParcel(Parcel parcel){
return new User(parcel);
}
@Override
public User[]newArray(int size){
return new User[0];
}
};
//Return hashcode of object
public int describeContents(){
return hashCode();
}
При переходе между действиями массив переходит от наличия n элементов (столько, сколько я добавил) к 0 элементам, указывая данные accountArrayбыл потерян во время передачи посылки.Я ценю любые идеи, которые вы можете придумать