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

eigenen Datentyp an einen Intent übergeben

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von fugu2.0, 16.03.2010.

  1. fugu2.0, 16.03.2010 #1
    fugu2.0

    fugu2.0 Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    3
    Registriert seit:
    12.03.2010
    Hallo Community,

    ich möchte einen eigenen Datentyp über putExtras an einen Intent übergeben. Die putExtras-Methode existiert ja für viele verschiedene Datentypen, allerdings nicht für den Object-Typ. Kann mir da jemand weiterhelfen?

    Danke schonmal und schöne Grüße,
    fugu2.0
     
  2. swordi, 16.03.2010 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    naja

    eine möglichkeit die mir spontan einfällt wäre dein objekt serializable zu machen und dann putSerializable aufzurufen
     
  3. DieGoldeneMitte, 16.03.2010 #3
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Da gibt es mehrere Möglichkeiten:​

    • Du kannst deine Klasse das Interface andoid.os.Parcelable implementieren lassen.
    • Du kannst über java.io.Serializable gehen und das ganze ale bytearray übergeben.
    • Du kannst an den Intent setData knüpfen.
     
  4. fugu2.0, 16.03.2010 #4
    fugu2.0

    fugu2.0 Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    3
    Registriert seit:
    12.03.2010
    Danke für die Tipps. Das mit Parcelable hab ich mal ausprobiert (bei setData ist mir das mit der URI nicht wirklich klar), allerdings bekomm ich jetzt ne NullPointerException. Mein App-Aufbau sieht wie folgt aus:

    Activity A erzeugt eine ArrayList vom Typ <MyType> der die Parcelable-Klasse erweitert.
    Code:
    ArrayList<MyType> aL = dies und jenes
    Diese ArrayList wird mit
    Code:
     i.putParcelableArrayListExtra("ArrayList", aL) 
    an den Intent i übergeben.

    In Activity B möchte ich die ArrayList einer anderen Variable über
    Code:
    ArrayList<MyType> mT = getIntent().getParcelableArrayList("ArrayList")
    abspeichern, allerdings bleibt mT null, was mir dann die NullPointerException auslöst.

    Was genau mach ich da falsch?


    EDIT: Hat sich erledigt. Lag an einer unglücklichen Kombination von Anfängerfehlern ^^
     
    Zuletzt bearbeitet: 16.03.2010
  5. SirMArtin, 16.03.2010 #5
    SirMArtin

    SirMArtin freier Samsungsupporter

    Beiträge:
    113
    Erhaltene Danke:
    7
    Registriert seit:
    05.08.2009
    Mit java.io.Serializable mache ich das erfolgreich.
     
  6. Kritzli, 18.03.2010 #6
    Kritzli

    Kritzli Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    23.02.2010
    könntet ihr mir das vielleicht nochmal erklären ? ich hab derzeit das selbe problem aber so ganz versteh ich noch nich, wie ich meine Liste weitergebe.
    blöderweise scheiterts bei mir schon am erweitern der ArrayListe.

    ich sag doch einfach:
    ArrayList <xy extends Parcelable> name;

    oder muss ich wie in den Beispielen die ich z.b. im Buch Android - Grundlagen der Programmierung gefunden hab, ne eigene Klasse für die ArrayList schreiben ?

    Erleuchtung... bitte ! :o
     
  7. fugu2.0, 18.03.2010 #7
    fugu2.0

    fugu2.0 Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    3
    Registriert seit:
    12.03.2010
    also deine Klasse, die du in die ArrayList packen willst, muss das Parcelable-Interface implementieren. Intern wird das ganze dann über HashMaps geregelt. Ich kann dir allerdings nicht sagen, ob das jetzt die einfachste/schönste/schnellste Methode ist, aber bei mir funktioniert sie soweit. Hier der Code:

    Code:
    public class MyType implements Parcelable {
        private HashMap<String, String> map;
     
        public MyType() {
            map = new HashMap<String, String>();
        }
     
        public MyType(Parcel in) {
            map = new HashMap<String, String>();
            readFromParcel(in);
        }
     
        public static final Parcelable.Creator<MyType> CREATOR = new Parcelable.Creator<MyType>() {
            public MyType createFromParcel(Parcel in) {
                return new MyType(in);
            }
     
            public MyType[] newArray(int size) {
                return new MyType[size];
            }
        };
     
        @Override
        public int describeContents() {
            return 0;
        }
     
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(map.size());
            for (String s: map.keySet()) {
                dest.writeString(s);
                dest.writeString(map.get(s));
            }
        }
     
        public void readFromParcel(Parcel in) {
            int count = in.readInt();
            for (int i = 0; i < count; i++) {
                map.put(in.readString(), in.readString());
            }
        }
     
        public String get(String key) {
            return map.get(key);
        }
     
        public void put(String key, String value) {
            map.put(key, value);
        }
    }
    an den Intent (i) kannst du das ganze dann mit
    Code:
    i.putParcelableArrayListExtra("<key>", <value>);
    
    übergeben und mit
    Code:
    getIntent().getParcelableArrayListExtra("<key>");
    
    in der anderen Activity wieder rausholen.

    Hoffe das hilft dir weiter ;)
     
  8. Kritzli, 19.03.2010 #8
    Kritzli

    Kritzli Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    23.02.2010
    super ! vielen Dank !! Das hat mir echt weitergeholfen ! Bist der Held des Tages ;)

    Bin zwar gestern bissl drüber verzweifelt und hab auch an der NullPointerException rumgerätselt... aber jetzt nochmal kurz angeguckt und... aaah. Blöder Fehler.

    Erst dacht ich ja, das will alles nicht, weil ich ne ArrayListe mit Buttons hab und nicht mit was eigenem. Aber, ja, Button kann man auch erweitern :rolleyes:
     
  9. Kritzli, 25.03.2010 #9
    Kritzli

    Kritzli Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    23.02.2010
    hm, hab doch noch ne frage, is heut erst aufgekommen.
    Und zwar das ich die ArrayListe übergeb klappt ja soweit ganz gut. Jetzt kommt das aber:
    ich kann keine Werte auslesen Oo

    Wie gesagt, hab ja ne Liste die nur Buttons aufnehmen soll, weil die ganz spezielle Werte krieg. Also wenn ich dann in der auslesenden Activity z.b. sag

    CharSequence s = button.getText();

    schreibt er mir in s nichts rein, auch wenn er mir in der vorherigen Activity brav seinen Text angezeigt hat. Hier hat er irgendwie alles wieder vergessen. Wisst ihr was ich mein ?
     
  10. fugu2.0, 25.03.2010 #10
    fugu2.0

    fugu2.0 Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    3
    Registriert seit:
    12.03.2010
    weiß grad noch nicht genau, was du meinst. Kannst du bitte mal das Error-Log posten?
     
  11. Kritzli, 25.03.2010 #11
    Kritzli

    Kritzli Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    23.02.2010
    naja, so wirklich nen Error Log hab ich nich, da die Activity an für sich tut was sie soll.
    Hier aber mal ein Codeschnipsel und ne genauere Erklärung:

    Code:
    public class keyboard_layout extends Activity{
    
        public static ArrayList<MyButton> kList;
        public Iterator iter;
           
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.keyboard_success);
            
            kList = getIntent().getExtras().getParcelableArrayList("list");
    
           //Hier guck ich, ob die Liste überhaupt befüllt ist
            Log.i("KList", "Length: " + kList.size());
    
             FileOutputStream fos = null;
             OutputStreamWriter osw = null;
             
             try{
                 fos = openFileOutput("keyboard.xml", MODE_WORLD_READABLE);
                 osw = new OutputStreamWriter(fos);  
                 osw.write("...");
                 osw.flush();
                 
                 fos = openFileOutput("keyboard.xml", MODE_APPEND);
                 osw = new OutputStreamWriter(fos);
                
                 for(iter = kList.iterator(); iter.hasNext(); ){
    
                     MyButton button = (MyButton) iter.next();
                    
                     osw.write("Key android:codes=");
                    
                     String text = button.getText().toString();
                     
                     Log.i("Text", "Länge: " + text.length()); // Länge: 0
                     Log.i("Text", "Text: " + text);           // Text: 
                     
                     ... //Dann kommt noch jede Menge, das wegen diesem Problem
                        //leider eh noch nicht läuft
    
    Also, in der Activity A werden Buttons definiert, einer davon hat z.b. den Text "abc". Zeigt er mir auch ohne Probleme an und ich kann auch mit button.getText() usw. arbeiten. Die Buttons werden dann einzeln in die ArrayList gesteckt und nach keyboard_layout (Activity B) verschickt. Dort sollen sie dann einzeln ausgelesen werden damit ich den Text der Buttons in einer Datei abspeichern kann.

    Nur wie gesagt, be ider Abfrage nach getText() oder Textlänge bekomme ich >nichts< oder 0.

    hoffe das hilft dir weiter :/
     
  12. fugu2.0, 26.03.2010 #12
    fugu2.0

    fugu2.0 Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    3
    Registriert seit:
    12.03.2010
    hier bekommst du auch eine Ausgabe in der Log-File? Das würde ja bedeuten, dass die Übergabe funktioniert hat.
    Wenn du mit Eclipse arbeitest, kannst du die Variable mit Rechtsklick --> Inspect inspizieren und dir den Wert angucken.
    Wenn da alles soweit korrekt drinsteht, würde ich mal tippen, dass dein Fehler beim Cast auf MyButton liegt, wobei der
    Iterator ja eigentlich Object zurückliefert. Genau kann ichs dir leider Momentan nicht sagen, aber da würde ich jetzt mal
    ansetzen und genauer schauen. Hoffe das hilft dir irgendwie weiter.

    Grüße
    fugu2.0
     
  13. Kritzli, 27.03.2010 #13
    Kritzli

    Kritzli Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    23.02.2010
    ja, er sagt mir, dass auch die richtige Anzahl an Objekte in meiner ArrayList sind. Also, das Problem liegt wirklich am Parcelable. Aber... ich verstehs mal so gar nicht .__. Also, warum er mir die Werte nicht richtig übergibt bzw. einfach das Objekt so lässt wie es sein soll... Werd noch wahnsinnig !

    Hier mal der Code:

    Code:
    
    public class MyButton extends Button implements Parcelable{
    
        private HashMap<String, String> map;
        public static Context context;
        
    //    public String text;
    //    public int width;
    //    public int height;
    //    public int id;
          
        public MyButton(Context context){
            super(context);
            this.context = context;
            map = new HashMap<String, String>();
        }
        
        public MyButton(Context context, AttributeSet attrs){
            super(context, attrs);
        }
        
        
        public MyButton(Parcel in){
            super(context);
            map = new HashMap<String, String>();
            readFromParcel(in);
        }
        
         public static final Parcelable.Creator<MyButton> CREATOR = new Parcelable.Creator<MyButton>() {
                public MyButton createFromParcel(Parcel in) {
                    return new MyButton(in);
                }
         
                public MyButton[] newArray(int size) {
                    return new MyButton[size];
                }
            };
         
            @Override
            public int describeContents() {
                return 0;
            }
         
            @Override
            public void writeToParcel(Parcel dest, int flags) {    
                dest.writeInt(map.size());
                for (String s: map.keySet()) {
                    dest.writeString(s);
                    dest.writeString(map.get(s));
                }
    //            dest.writeString(text);
    //            dest.writeInt(width);
    //            dest.writeInt(height);
    //            dest.writeInt(id);
                
            }
         
            public void readFromParcel(Parcel in) {
                int count = in.readInt();
                for (int i = 0; i < count; i++) {
                    map.put(in.readString(), in.readString());
                }
    //            text = in.readString();
    //            width = in.readInt();
    //            height = in.readInt();
    //            id = in.readInt();
            }
         
            public String get(String key) {
                return map.get(key);
            }
         
            public void put(String key, String value) {
                map.put(key, value);
            }
            
    //        public void setText(String text) {
    //            this.text = text;
    //        }
    //
    //        public void setWidth(int width) {
    //            this.width = width;
    //        }
    //
    //        public void setHeight(int height) {
    //            this.height = height;
    //        }
    //
    //        public void setId(int id) {
    //            this.id = id;
    //        }
        }
    
    
    
    Also die Variablen Text, ID, Weite und Höhe hab ich mal reingenommen gehabt, weil ich woanders was über Parcelable gelesen hatte und gedacht hab, dass es vielleicht daran liegen könnt, dass die net initialisiert werden. Aber, wenn ich doch in meiner Liste fertige MyButton - Objekte hab, dann müsste dass ja auch alles gesetzt sein.
    ich verstehs nich .__.
     
  14. fugu2.0, 29.03.2010 #14
    fugu2.0

    fugu2.0 Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    3
    Registriert seit:
    12.03.2010
    Hey Kritzli,

    also ich habe mir mal ein Projekt mit deinem Code angelegt und stoße auf das gleiche Problem. Der Text der Buttons geht irgendwo auf dem Weg zwischen den beiden Activities verloren.

    bei mir sieht das vereinfacht so aus:
    Ich hab nen Button, der die andere Activity über einen Intent aufruft. Dem Intent geb ich ne ArrayList<MyButton> mit

    Code:
    public void onClick(View v) {
        mIntent = new Intent();
        mIntent.putParcelableArrayListExtra("buttons", buttonList);
        mIntent.setClass(v.getContext(), AndroidHilfe.class);
        startActivity(mIntent);                
    }
    
    Inspiziere ich nun die buttonList so sind da 10 Buttons auch alle mit Text drin. Hol ich die aber in der zweiten Activity mit

    Code:
    kList = getIntent().getParcelableArrayListExtra("buttons");
    
    wieder raus, so ist der Text der einzelnen Buttons in kList leer. Wieso das so ist, kann ich dir allerdings auch nicht sagen, sorry. Würde mich aber auch mal interessieren. Falls du noch was rausbekommst, kannst ja mal bescheid sagen.
     
  15. DieGoldeneMitte, 29.03.2010 #15
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Das Einzige, was Du zur Übertragung verpackst, sind die zusätzlichen Felder "map" (und so weiter). Der Text eines Buttons wird nirgends übertragen. Ich denke, da fehlt so etwas in der Art dest.writeString(getText()) und setText(in.readString())

    Übrigens: Ein Button hat noch viel mehr Attribute...
     
  16. Kritzli, 31.03.2010 #16
    Kritzli

    Kritzli Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    23.02.2010
    hey, danke für eure antworten.
    Ich weiß das ein Button wesentlich mehr attribute hat als nur die drei. Aber das waren vorerst die wichtigsten die ich brauch.

    Na, auf jedenfall hab ichs jetzt hingekriegt, meine ArrayList weiterzugeben. Das is sooo ... argh. Ich sags euch.

    Also, ich hab folgendes (am Ende des Internets) gefunden:
    Solange die beiden Activities die die Liste nutzen wollen im selben Prozess laufen (davon geh ich einfach mal aus) kann man die Liste dadurch übergeben, dass man sie global und static macht und dann einfach drauf zugreift.
     
  17. Axel, 31.03.2010 #17
    Axel

    Axel Neuer Benutzer

    Beiträge:
    16
    Erhaltene Danke:
    1
    Registriert seit:
    29.01.2010
    Also, ich habe mal am Anfang des Internets gefunden, dass globale Variablen böse sind ;-)

    Warum benutzt du nicht einen Handler und sendMessage? Oder einen Service?
     
  18. fugu2.0, 02.04.2010 #18
    fugu2.0

    fugu2.0 Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    3
    Registriert seit:
    12.03.2010
    ja, das mit den globalen Variablen würde ich auch eher als letzten Ausweg sehen. Services hatte ich mir diese Woche mal angesehen, haben mir aber bei einem anderen Problem nicht so viel weitergeholfen. Weiß nicht wie das bei dir aussieht.
     
  19. jaipur, 05.04.2010 #19
    jaipur

    jaipur Neuer Benutzer

    Beiträge:
    20
    Erhaltene Danke:
    0
    Registriert seit:
    03.03.2010
    öhm, auf welche aussage bezogen?
     
  20. Axel, 06.04.2010 #20
    Axel

    Axel Neuer Benutzer

    Beiträge:
    16
    Erhaltene Danke:
    1
    Registriert seit:
    29.01.2010
    Activity A kann mit sendMessage einen beliebigen Datentyp an Activity B "übergeben". A und B könnten auch gemeinsam einen Service nutzen...
     

Diese Seite empfehlen