2013-08-31 2 views
1

У меня есть объект Address, который имеет значение, как: имя, адрес, город, штат, почтовый индекс, телефон и т.д.Передача объектов между деятельностью в Android

Я заселить объект с помощью HTTP-вызова. Эта переменная заполняется. Тогда я стараюсь передать объект в следующей деятельности, делая так:

Intent intent = new Intent(NewAddressActivity.this, BuildingTypeActivity.class); 
Bundle b = new Bundle(); 
b.putParcelable("newAddress", (Parcelable)newAddress); // i had to cast 'newAddress' to 'Parcelable' otherwise, it was giving me an error 
intent.putExtra("newAddress", b); 
startActivity(intent); 

И в следующей деятельности (BuildingTypeActivity), Принести объект как так.

Bundle b = this.getIntent().getExtras(); 
if (b != null) { 
Address address = b.getParcelable("newAddress"); 
} 

Проблема в том, что она всегда сбой, когда я добираюсь до линии «putParcelable». Это может иметь какое-то отношение к приведению к Parcelable. Итак, я предполагаю, что это неправильный способ передачи объектов?

Любые советы о том, как правильно передать объекты, были бы весьма полезны.

+0

http://androidhub.wordpress.com/2011/08/03/android-intents-for-passing-data-between-activities-part-3/. проверьте это – Raghunandan

+2

. Ваш адресный объект должен реализовать Parceble, если вы хотите использовать putParcelable – pumpkee

ответ

3

Вам нужно сделать что-то вроде этого:

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

public class Address implements Parcelable { 

    private String name, address, city, state, phone, zip; 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    /* 
      THE ORDER YOU READ OBJECT FROM AND WRITE OBJECTS TO YOUR PARCEL MUST BE THE SAME 
    */ 

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
     parcel.writeString(name); 
     parcel.writeString(address); 
     parcel.writeString(city); 
     parcel.writeString(state); 
     parcel.writeString(phone); 
     parcel.writeString(zip); 
    } 


    public Address(Parcel p){ 
     name = p.readString(); 
     address = p.readString(); 
     city = p.readString(); 
     state = p.readString(); 
     phone = p.readString(); 
     zip = p.readString(); 
    } 

    // THIS IS ALSO NECESSARY 
    public static final Creator<Address> CREATOR = new Creator<Address>() { 
     @Override 
     public Address createFromParcel(Parcel parcel) { 
      return new Address(parcel); 
     } 

     @Override 
     public Address[] newArray(int i) { 
      return new Address[0]; 
     } 
    }; 
} 

И теперь вы не должны бросить свой newAddress экземпляр Parcelable.

0

Для отливки объекта до Parcelable ваш класс для этого объекта должен быть Parcelable. Следовательно, вам необходимо реализовать интерфейс Parcelable, как было предложено выше.

0

Вы можете использовать сериализации, чтобы получить работу done..it это самый простой способ ... here

0

EDIT: просто понял, что это очень старый пост :)

Parcelable лучше практика, но да утомительно написать код и сохранить его. Этот сайт может быть рука помощи для этого

Parcelabler

Примечание: Я не пробовал Parcelable создана с этим, так как я не столкнуться с необходимостью, но да, стоит попробовать

0

Вы может легко передавать объекты в рамках, используя интерфейс Serializable. Для этой цели объект, который вы передаете, должен быть экземпляром класса, реализующего интерфейс Serializable. Вот простой пример, чтобы передать объект от одного намерения другому. В этом примере объект testObject класса TestClass был отправлен от MainActivity до NewActivity.

activity_main.xml:

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Click Here" 
    android:id="@+id/button" 
    android:layout_centerVertical="true" 
    android:layout_centerHorizontal="true" 
    android:onClick="changeIntent" /> 

activity_new.xml:

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="Medium Text" 
    android:id="@+id/textView" 
    android:layout_centerVertical="true" 
    android:layout_centerHorizontal="true" /> 

ГлавнаяActivity.Java:

package com.example.nabin.serializabledemo; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.view.View; 

public class MainActivity extends ActionBarActivity { 
    TestClass testObject; 
    Intent intent; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     testObject = new TestClass("Name"); 
    } 
    public void changeIntent(View v){ 
     intent = new Intent(MainActivity.this,NewActivity.class); 
     intent.putExtra("sampleObject", testObject); 
     startActivity(intent); 
    } 
} 

TestClass.java:

package com.example.nabin.serializabledemo; 

import java.io.Serializable; 

public class TestClass implements Serializable{ 
    String classname; 
    int no = 1; 
    String [] sampleArray = {"Apple", "Banana"}; 
    public TestClass(String name){ 
     classname = name; 
    } 
} 

NewActivity.java:

package com.example.nabin.serializabledemo; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.widget.TextView; 

public class NewActivity extends ActionBarActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_new); 
     Intent i = getIntent(); 
     TestClass tc = (TestClass)i.getSerializableExtra("sampleObject"); 
     String name = tc.classname; 
     int no = tc.no; 
     String [] array = tc.sampleArray; 
     TextView textView = (TextView) findViewById(R.id.textView); 
     textView.setText("Name: "+name+"\nno: "+no+"\nArray: "+ array[0]+" " + array[1]); 
    } 
} 

Надежда этот пример поможет вам.

Смежные вопросы