android putint Parzellierbares Objekt, das übergebene Daten empfängt, die auf Null kommen



implement parcelable android (1)

Okay, wenn du das machst:

Intent updateIntent = new Intent(MainActivity.this, ContactsActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("contact", item);
updateIntent.putExtra(ContactsActivity.RECIVED_CONTACT, bundle);
startActivityForResult(updateIntent,1);
adapter.notifyDataSetChanged();

Sie haben am Ende eine Datenstruktur wie:

Intent {
    Bundle extras {
        Bundle bundle {
            Contact contact;
        }
    }
}

und wenn Sie es abrufen:

Parcelable receivedContact = getIntent().getParcelableExtra("contact"); 

Du schaust nicht tief genug. Sie suchen im Intent.getExtras() nach einem Feld mit dem Namen "contact". Sie müssen jedoch zuerst das enthaltene Intent.getExtras() , in das Sie es Intent.getExtras() :

Bundle bundle = getIntent().getBundleExtra(ContactsActivity.RECEIVED_CONTACT);
Contact contact = bundle.getParcelableExtra("contact");

Alternativ kannst du den Kontakt direkt in die Extras der Absicht einfügen:

Intent updateIntent = new Intent(MainActivity.this, ContactsActivity.class);
updateIntent.putExtra(ContactsActivity.RECEIVED_CONTACT, item);

und abrufen mit:

Contact contact = getIntent().getParcelableExtra(ContactsActivity.RECEIVED_CONTACT);

Ich arbeite an einer Android-App, die Kontaktinformationen speichert. Ich versuche, eine Funktion hinzuzufügen, die beim Klicken auf ein Kontaktelement in der ListView das Kontaktobjekt sendet, das parzellierbar über zwei die zweite Aktivität implementiert.

Dies ist der Ort, an den ich das Kontaktobjekt an die Kontaktaktivität übergebe. `

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    final Contact item = (Contact) getListAdapter().getItem(position);

    Intent updateIntent = new Intent(MainActivity.this, ContactsActivity.class);
    Bundle bundle = new Bundle();
    bundle.putParcelable("contact", item);
    updateIntent.putExtra(ContactsActivity.RECIVED_CONTACT, bundle);
    startActivityForResult(updateIntent,1);
    adapter.notifyDataSetChanged();
}`

Dies ist in der onCreate der Kontakte-Aktivitätsklasse enthalten, die überprüft, ob Daten mit dem RECIVED_CONTACT-Tag übergeben wurden. Die Zeile, in der ich ein Objekt vom Typ Parcelable habe, wo ich die Fehler habe, bekomme ich eine Nullzeiger-Ausnahme.

if (getIntent().getParcelableExtra(ContactsActivity.RECIVED_CONTACT) != null) {

    //This line is where the exception ouccurs
    Parcelable receivedContact = getIntent().getParcelableExtra("contact"); 
    updateContact(receivedContact);
}

Mein Kontaktobjekt sieht so aus

public class Contact implements Parcelable {

String firstName;
String lastName;
String email;
String phone;

/**
 * Constructor
 */
public Contact(String firstName, String lastName, String email, String phone) {
    // TODO Auto-generated constructor stub
    this();
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
    this.phone = phone;
}

public Contact(Parcel parcel) {
    this.firstName = parcel.readString();
    this.lastName = parcel.readString();
    this.email = parcel.readString();
    this.phone = parcel.readString();
}

 // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
    public static final Parcelable.Creator<Contact> CREATOR = new Parcelable.Creator<Contact>() {
        public Contact createFromParcel(Parcel in) {
            //return new Contact(in);
            Contact mContact = new Contact();
            mContact.firstName = in.readString();
            mContact.lastName = in.readString();
            mContact.email = in.readString();
            mContact.phone = in.readString();
            return mContact;
        }

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

    };

    public Contact() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @return the firstName
     */
    public String getFirstName() {
        return firstName;
    }

    /**
     * @return the lastName
     */
    public String getLastName() {
        return lastName;
    }

    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }

    /**
     * @return the phone
     */
    public String getPhone() {
        return phone;
    }

    public String toString() {
        return firstName + " \n" + lastName + " \n"
                + email + " \n" + phone + " \n\n";
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    // write your object's data to the passed-in Parcel
    public void writeToParcel(Parcel out, int flags) {
        out.writeString(firstName);
        out.writeString(lastName);
        out.writeString(email);
        out.writeString(phone);
    }

}

Ich bin nicht in der Lage, herauszufinden, wie das zu beheben, also wenn Sie mehr von meinem Code nur fragen möchten, und ich werde es veröffentlichen. Ich weiß nicht viel über Parcelable-Objekte, und ich denke, deshalb habe ich mich darum gekümmert.

Ich war jedoch in der Lage, wenn ich eine Add-Schaltfläche in der MainActivity klicken, um eine zweite ContactsActivity mit einigen EditText-Feldern zum Hinzufügen von Vor- und Nachnamen, E-Mail und Telefon zu starten, dann jede dieser vier Strings in ein Kontaktobjekt und senden Sie es zurück an die Hauptaktivität, die angezeigt werden soll. Ich habe diesen Code hier nicht gepostet, weil dieser Code funktioniert. Ich bin nicht in der Lage, herauszufinden, wie Sie eines der Kontaktobjekte aktualisieren, die sich bereits in der ListView befinden.

Ich möchte in der Lage sein, das aus der ListView ausgewählte Kontaktobjekt an die ContactsActivity zu senden und jede der vier Datenfolgen in die editText-Felder zu schreiben.





parcelable