eigenen Datentyp an einen Intent übergeben

F

fugu2.0

Neues Mitglied
3
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
 
naja

eine möglichkeit die mir spontan einfällt wäre dein objekt serializable zu machen und dann putSerializable aufzurufen
 
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.
 
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:
Mit java.io.Serializable mache ich das erfolgreich.
 
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
 
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 ;)
 
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:
 
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 ?
 
weiß grad noch nicht genau, was du meinst. Kannst du bitte mal das Error-Log posten?
 
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 :/
 
//Hier guck ich, ob die Liste überhaupt befüllt ist
Log.i("KList", "Length: " + kList.size());
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
 
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 .__.
 
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.
 
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...
 
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.
 
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?
 
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.
 
Axel schrieb:
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?

öhm, auf welche aussage bezogen?
 
Activity A kann mit sendMessage einen beliebigen Datentyp an Activity B "übergeben". A und B könnten auch gemeinsam einen Service nutzen...
 

Ähnliche Themen

FabianDev
Antworten
5
Aufrufe
531
swa00
swa00
R
  • RudolfHagen
Antworten
1
Aufrufe
637
koje71
koje71
M
Antworten
8
Aufrufe
945
deek
D
Zurück
Oben Unten