1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Eigener Datentyp zwischen Activitys übergeben

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von mybecks, 14.09.2010.

  1. mybecks, 14.09.2010 #1
    mybecks

    mybecks Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    83
    Erhaltene Danke:
    3
    Registriert seit:
    20.11.2009
    Hallo zusammen,

    Vorneweg, ich weiß das es hier einen ähnlichen Thread gibt, aber dieser befasst sich nur mit den simplen Datentypen.

    Ich habe mir einen eigenen erstellt, den ich nach Beendigung eines WS Calls mit dem Result fülle.

    EntryList.java:
    PHP:
    public class EntryList{
        
        private 
    ArrayList<Stringdate = new ArrayList<String>();

        public 
    EntryList(){
            
    super();
        }

        public 
    ArrayList<StringgetDate() {
            return 
    date;
        }

        public 
    void setDate(String date) {
            
    this.date.add(date);
        }
    }
    Wenn ich jetzt das Interface Parcable implementiere, hab ich momentan ein kleines Verständnisproblem wie ich die Methode writeToParcel aus programmieren soll.

    Mein Versuch:
    PHP:
    @Override
        
    public void writeToParcel(Parcel destint flags) {
            
    int size date.size();
            
            
    dest.writeInt(size);
            
            for(
    int i=0i<sizei++){
                
    dest.writeString(date.get(i));
            }
        }
    Wenn ich dann folgendes Verusche:
    A
    PHP:
    Bundle b = new Bundle();
                        
                        
    b.putParcelable("parcable"entryList);
                        
                        
    intent = new Intent(<ClassFrom>.this, <ClassDest>.class);
                        
    intent.putExtra("bundle"b);
                        
                        
    startActivity(intent);
    B
    PHP:
    Bundle b getIntent().getExtras();
            
    entryList b.getParcelable("parcable");
            
    Toast.makeText(this"Size of EntryList: "+entryList.getDate().size(), Toast.LENGTH_SHORT).show();
    bekomm ich bei B immer eine wunderschöne NullPointer um die Ohren gehauen. Bloß ich hab kein Plan wie ich meine EntryList serializieren bzw. korrekt in ein Parcel verpackt bekomme.

    Habe mich ein wenig an dem Tutorial bei anddev.org orientiert. Aber da ist es vom Aufbau her anderster. Wisst ihr wie ich meinen eigenen DT verschicken kann?

    Vielen Dank & Grüße,
    mybecks
     
  2. BenOtto, 14.09.2010 #2
    BenOtto

    BenOtto Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    15
    Registriert seit:
    30.08.2010
    In den FAQs bei Android gibt's eine schöne Beschreibung für dein Anliegen:

    Android Application Framework FAQ | Android Developers

    Falls du es mit Parcelable lösen möchest brauchst du in deiner EntryList noch ein statisches Feld namens CREATOR, hinter dem sich der "Erbauer" deines Parcels verbirgt. Einfacher geht es wie im Link beschrieben.
     
  3. mr.freeze, 16.02.2011 #3
    mr.freeze

    mr.freeze Android-Hilfe.de Mitglied

    Beiträge:
    74
    Erhaltene Danke:
    1
    Registriert seit:
    02.09.2010
    was ist denn unter punkt hashMap gemeint?

    soll das auch ein
    A public static field/method


    sein oder was meinen die damit?

    Gruß
     
  4. BenOtto, 24.02.2011 #4
    BenOtto

    BenOtto Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    15
    Registriert seit:
    30.08.2010
    Es klingt so, als würden sie das meinen. Welche Vorteile das gegenüber eines einfach als static deklarierten Members hat kann ich dir aber nicht sagen.
     
  5. jskeletti, 24.05.2011 #5
    jskeletti

    jskeletti Erfahrener Benutzer

    Beiträge:
    154
    Erhaltene Danke:
    6
    Registriert seit:
    11.08.2010
    Hat jemand eine Lösung für das Problem?
     
  6. BenOtto, 24.05.2011 #6
    BenOtto

    BenOtto Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    15
    Registriert seit:
    30.08.2010
  7. jskeletti, 24.05.2011 #7
    jskeletti

    jskeletti Erfahrener Benutzer

    Beiträge:
    154
    Erhaltene Danke:
    6
    Registriert seit:
    11.08.2010
    Ja, die Klasse hab ich auch schon so weit erweitert, nur hab ich keine Ahnung wie ich es hin und her "schieben" kann. Ich bekomme beim lesen des Objekts immer nur null.
     
  8. jskeletti, 24.05.2011 #8
    jskeletti

    jskeletti Erfahrener Benutzer

    Beiträge:
    154
    Erhaltene Danke:
    6
    Registriert seit:
    11.08.2010
    OK, mein Problem ist vielleicht ein kleines bißchen anders: Ich will keine Liste schicken, sondern ein einzelnes Objekt. Hab da folgende Klasse und wie ich es schicke und empfange:
    PHP:
    public class Warunek implements Parcelable {
      ...
      public 
    Warunek() {
      }
        
      public 
    Warunek(Parcel in){
          
    readFromParcel(in);
      }

      @
    Override
      
    public void writeToParcel(Parcel outint flags) {
          
    out.writeValue(this); // hier kommt 05-24 09:32:13.124: ERROR/AndroidRuntime(477): java.lang.StackOverflowError
      
    }
        
      public 
    void readFromParcel(Parcel in) {
          
    Warunek w = (Warunekin.readValue(new ClassLoader() {
          });
          ...
      }

      public static final 
    Parcelable.Creator<WarunekCREATOR = new Parcelable.Creator<Warunek>() {
          public 
    Warunek createFromParcel(Parcel in) {
              return new 
    Warunek(in);
          }

          public 
    Warunek[] newArray(int size) {
              return new 
    Warunek[size];
          }
        };
    }
    Senden:
    PHP:
    Intent i = new Intent(getApplicationContext(), WarunekMapView.class);
                    
    Bundle b = new Bundle();
    b.putParcelable("warunek", (Warunek)lv.getItemAtPosition(position)); // ein Objekt aus dem ListView
    i.putExtra("bundle"b);
                    
    startActivity(i);
    Empfangen:
    PHP:
    protected void onCreate(Bundle savedInstanceState) {
       
    super.onCreate(savedInstanceState);
            
       ...

       
    Bundle b getIntent().getExtras();
       
    Warunek w b.getParcelable("warunek");

       
    System.out.println(warunek);
       ...
    }
     
    Zuletzt bearbeitet: 24.05.2011
  9. BenOtto, 24.05.2011 #9
    BenOtto

    BenOtto Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    15
    Registriert seit:
    30.08.2010
    out.writeValue(this);

    Das ist das Problem. Lies mal die Doku: Parcel | Android Developers)

    Da können wiederum nur parcelable Objekte übergeben werden. In ein parcel solltest du die (primitiven) Member deines Objekts schreiben.
     
  10. jskeletti, 24.05.2011 #10
    jskeletti

    jskeletti Erfahrener Benutzer

    Beiträge:
    154
    Erhaltene Danke:
    6
    Registriert seit:
    11.08.2010
    Gelesen hab ich das. Klasse ist Parcelable und das Parcel bietet ja ein writeValue(Object o) ja an. Und mit this schick ich ihm doch auch ein Objekt, oder verstehe ich da was falsch?

    Edit: Ja, ich verstehe da was falsch... :)
     
    Zuletzt bearbeitet: 24.05.2011
  11. Thyrion, 24.05.2011 #11
    Thyrion

    Thyrion Ehrenmitglied

    Beiträge:
    11,845
    Erhaltene Danke:
    2,450
    Registriert seit:
    21.07.2009
    Phone:
    Nexus 5X
    Dein Problem ist eine indirekte Rekursion:

    Über die Methode writeToParcel legst du ja fest, wie genau dein Objekt serialisiert werden soll.
    Du sagst einfach: Hey, schreib dich selbst -> out.writeValue(this).
    Also sagt sich das System: "Super, dann frage ich das übergebene Objekt (this), wie es sich serialisiert" -> "Ja schreib mich selbst" -> "Wie mache ich das?" -> "Schreib mich selbst" -> ... uswusf. bis zum StackOverflow.

    In DEINER writeToParcel-Methode wird erwartet, wie genau, in allen Einzelheiten, sich das Objekt serialisieren soll - idealerweise runtergebrochen auf die einzelnen Member.
     

Diese Seite empfehlen