2012-05-13 2 views
1

У меня есть класс, который содержит данные, которые я хочу передать ему между намерениями, этот класс имеет arraylist, который содержит другие объекты класса. это мой классКак передать объекты между намерениями

public class ParsedData implements Parcelable { 

     public String error; 
     public float protectionLevel; 
     public int protectionLevelColor; 
     public double lastBackup; 
     public boolean compressedType; 
     public Long driveFreeSpaceSize; 
     ArrayList<Item>Items = new ArrayList<Item>(); 
} 

class Item { 

    public String name; 
    public float percentage; 
    public int files; 
    public long size; 
} 

Как я могу отправить этот класс между намерениями?

+0

Вы должны прочитать HTTP : //mobileorchard.com/android-app-development-using-intents-to-pass-data-and-return-results-between-activities/. Достаточно подробная информация о намерениях и передача дополнительных данных. Также немного об использовании данных и возвращении данных из Intent. – Hidde

+0

Помогает ли это реализовать 'Parcelable' в' Item'? –

ответ

1

Это может быть ваша проблема:

Классы, реализующие Parcelable интерфейс также должен иметь статическое поле называется CREATOR, который является объектом, реализующим интерфейс Parcelable.Creator.

В качестве альтернативы, я постараюсь иметь Item орудие Parcelable.

Альтернативой отказоустойчивости является запись вашей структуры данных в строку JSON, которая также позволяет передавать данные другим приложениям, не имеющим доступа к вашему классу ParsedData.

+0

Большое вам спасибо, что было моя проблема, я позволил классу Item реализовать Parcelable – AnasBakez

1

Вы можете взглянуть на Intent.putExtra (String name, Parcelable object) и реализовать в своем классе посыльный интерфейс.

+0

Я не могу поменять паркет, это моя проблема – AnasBakez

+0

Другое решение - вы можете создать статический класс с массивом, тогда вы можете передать его другому приложению без реализации Parcelable. Но это не очень хорошая практика. –

3

Вы можете сообщить об этом class Item и использовать Intent.putExtra(String, Serializable). Так как ArrayList реализует также интерфейс Serializable, вы можете передать весь объект Items.

1

Я нашел ответ в конце концов. спасибо всем, как помогло мне это ответ:

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

public class ParsedData implements Parcelable { 

    public String error; 
    public float protectionLevel; 
    public int protectionLevelColor; 
    public double lastBackup; 
    public boolean compressedType; 
    public Long statusSendTime; 
    ArrayList<Item>Items = new ArrayList<Item>(); 

    //---------------------Constructors--------------------------- 
    public ParsedData() { ; }; 

    public ParsedData(Parcel in) { 
     readFromParcel(in); 
    } 
    //------------------------------------------------------------ 

    @Override 
    public int describeContents() { 
     return 0; 
    } 
    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(error); 
     dest.writeFloat(protectionLevel); 
     dest.writeInt(protectionLevelColor); 
     dest.writeDouble(lastBackup); 
     dest.writeByte((byte) (compressedType ? 1 : 0)); 
     dest.writeLong(statusSendTime); 
     dest.writeList(Items); 

    } 

    private void readFromParcel(Parcel in) { 
     error = in.readString(); 
     protectionLevel = in.readFloat(); 
     protectionLevelColor = in.readInt(); 
     lastBackup = in.readDouble(); 
     compressedType =in.readByte() == 1; 
     statusSendTime = in.readLong(); 
     in.readList(Items,Item.class.getClassLoader()); 

    } 

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
        public ParsedData createFromParcel(Parcel in) { 
         return new ParsedData(in); 
        } 

        public ParsedData[] newArray(int size) { 
         return new ParsedData[size]; 
        } 
       }; 
} 

class Item implements Parcelable { 

    public String name; 
    public float percentage; 

    //---------------------Constructors--------------------------- 
    public Item() { 
     } 
    public Item(Parcel in) { 
      readFromParcel(in); 
     } 
    //------------------------------------------------------------ 

    @Override 
    public int describeContents() { 
     return 0; 
    } 
    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(name); 
     dest.writeFloat(percentage); 
    } 
    public static final Creator<Item> CREATOR = new Creator<Item>() { 
      public Item createFromParcel(Parcel source) { 
      return new Item(source); 
      } 
      public Item[] newArray(int size) { 
      return new Item[size]; 
      } 
     }; 
     private void readFromParcel(Parcel in) { 
      this.name = in.readString(); 
      this.percentage = in.readFloat(); 
      } 
} 

и в деятельности вызывающего абонента

ParsedData data = new PArsedData(); 
    Intent intentBreakDown = new Intent(this,BreakDownBarActivity.class); 
    intentBreakDown.putExtra("data", data); 
    startActivity(intentBreakDown); 

в вызываемой деятельности (BreakDownBarActivity в моем случае)

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.breakdownbar); 

     Bundle b = getIntent().getExtras(); 
     ParsedData data = (ParsedData)b.getParcelable("data"); 
    }