2011-05-02 244 views
3

我已經嘗試了許多不同的解決方案,這裏發現了很多不同的解決方案和許多其他網站 - 但我不能讓它工作!在活動之間傳遞自定義對象

我有一個對象「公寓」在另一項活動中使用的活動。 活動從類MyMapOverlayItem開始,並應該啓動ApartmentInfoActivity,其中應使用Apartment對象。

MyMapOverlayItem.java:

package com.android.madsoft.spotter; 

import java.util.ArrayList; 

import android.content.Context; 
import android.content.Intent; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 

import com.google.android.maps.ItemizedOverlay; 
import com.google.android.maps.OverlayItem; 

public class MyMapOverlayIcon extends ItemizedOverlay<OverlayItem> { 
    Context mContext; 
    ArrayList<Apartment> myList; 
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 
    public MyMapOverlayIcon(Drawable defaultMarker) { 
     super(defaultMarker); 

    } 

    public MyMapOverlayIcon(Drawable defaultMarker, Context context, ArrayList<Apartment> myList) { 
     super(boundCenterBottom(defaultMarker)); 
      mContext = context; 
      this.myList = myList; 

     } 

    public void addOverlay(OverlayItem overlay) { 
     mOverlays.add(overlay); 
     populate(); 
    } 

    @Override 
    protected boolean onTap(int index) { 
     Apartment ap = myList.get(index); 
     ApartmentParcel ap1 = new ApartmentParcel(ap); 
     Intent i = new Intent(mContext, ApartmentInfoActivity.class); 
     Bundle b = new Bundle(); 
     b.putParcelable("app", ap1); 
     i.putExtras(b); 
//  i.putExtra("app",ap1); 
//  b.putSerializable("apartment", ap); 

     // WHAT TO DO!? 

     mContext.startActivity(i); 

     return true; 
    } 

    @Override 
    protected OverlayItem createItem(int i) { 
     return mOverlays.get(i); 
    } 

    @Override 
    public int size() { 
     return mOverlays.size(); 
    } 

} 

Apartment.java:

package com.android.madsoft.spotter; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 


public class Apartment { 


    private static final long serialVersionUID = 1L; 
    int latitude, longitude; 
    String id, 
    zipcode, 
    size, 
    rooms, 
    rentprice, 
    deposit, 
    takeoverdate, 
    rentperiod, 
    furniturized, 
    usagecost, 
    addeddate, 
    description, 
    prepaid; 
    ArrayList<String> imageList, phonenumbers; 
    int imagecount = 1; 
    ArrayList<Bitmap> bigBitmapList; 
    ArrayList<Bitmap> smallBitmapList; 

    public Apartment(String id, int latitude, int longitude, 
        String zipcode, String size, String rooms, 
        String rentprice, String deposit, String prepaid, String takeoverdate, 
        String rentperiod, String furniturized, String usagecost, 
        String addeddate, String description, ArrayList<String> imageList, ArrayList<String> phonenumbers){ 
     bigBitmapList = new ArrayList<Bitmap>(); 
     smallBitmapList = new ArrayList<Bitmap>(); 
     this.addeddate = addeddate; 
     this.deposit = deposit; 
     this.description = description; 
     this.furniturized = furniturized; 
     this.id = id; 
     this.imageList = imageList; 
     this.latitude = latitude; 
     this.longitude = longitude; 
     this.phonenumbers = phonenumbers; 
     this.prepaid = prepaid; 
     this.rentperiod = rentperiod; 
     this.rentprice = rentprice; 
     this.rooms = rooms; 
     this.size = size; 
     this.takeoverdate = takeoverdate; 
     this.usagecost = usagecost; 
     this.zipcode = zipcode; 

     for (String s :imageList){ 

      URL myFileUrl = null; 
      try { 
       myFileUrl= new URL(s); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } 
      try { 
       HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection(); 
       conn.setDoInput(true); 
       conn.connect(); 
       InputStream is = conn.getInputStream(); 
       Bitmap image = BitmapFactory.decodeStream(is); //Saves the current icon 
       bigBitmapList.add(image); 
       //Icon will now be resized to 125px*100px    
        Bitmap resized; 
        int scalerate = (int)image.getHeight()/60; 
        int newHeight = (int)image.getHeight()/scalerate; 
        int newWidth = (int)image.getWidth()/scalerate; 
        resized = Bitmap.createScaledBitmap(image, newWidth, newHeight, false); 
        smallBitmapList.add(resized); 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
      } 
     } 

ApartmentParcel.java:

package com.android.madsoft.spotter; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Parcel; 
import android.os.Parcelable; 

public class ApartmentParcel implements Parcelable { 

    private static final long serialVersionUID = 1L; 
    int latitude, longitude; 
    String id, 
    zipcode, 
    size, 
    rooms, 
    rentprice, 
    deposit, 
    takeoverdate, 
    rentperiod, 
    furniturized, 
    usagecost, 
    addeddate, 
    description, 
    prepaid; 
    ArrayList<String> imageList, phonenumbers; 
    int imagecount = 1; 
    ArrayList<Bitmap> bigBitmapList; 
    ArrayList<Bitmap> smallBitmapList; 

    public ApartmentParcel(String id, int latitude, int longitude, 
        String zipcode, String size, String rooms, 
        String rentprice, String deposit, String prepaid, String takeoverdate, 
        String rentperiod, String furniturized, String usagecost, 
        String addeddate, String description, ArrayList<String> imageList, ArrayList<String> phonenumbers){ 
     bigBitmapList = new ArrayList<Bitmap>(); 
     smallBitmapList = new ArrayList<Bitmap>(); 
     this.addeddate = addeddate; 
     this.deposit = deposit; 
     this.description = description; 
     this.furniturized = furniturized; 
     this.id = id; 
     this.imageList = imageList; 
     this.latitude = latitude; 
     this.longitude = longitude; 
     this.phonenumbers = phonenumbers; 
     this.prepaid = prepaid; 
     this.rentperiod = rentperiod; 
     this.rentprice = rentprice; 
     this.rooms = rooms; 
     this.size = size; 
     this.takeoverdate = takeoverdate; 
     this.usagecost = usagecost; 
     this.zipcode = zipcode; 

     for (String s :imageList){ 

      URL myFileUrl = null; 
      try { 
       myFileUrl= new URL(s); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } 
      try { 
       HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection(); 
       conn.setDoInput(true); 
       conn.connect(); 
       InputStream is = conn.getInputStream(); 
       Bitmap image = BitmapFactory.decodeStream(is); //Saves the current icon 
       bigBitmapList.add(image); 
       //Icon will now be resized to 125px*100px    
        Bitmap resized; 
        int scalerate = (int)image.getHeight()/60; 
        int newHeight = (int)image.getHeight()/scalerate; 
        int newWidth = (int)image.getWidth()/scalerate; 
        resized = Bitmap.createScaledBitmap(image, newWidth, newHeight, false); 
        smallBitmapList.add(resized); 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
      } 
     } 

    public ApartmentParcel(Apartment ap){ 
     bigBitmapList = new ArrayList<Bitmap>(); 
     smallBitmapList = new ArrayList<Bitmap>(); 
     this.addeddate = ap.getAddeddate(); 
     this.deposit = ap.getDeposit(); 
     this.description = ap.getDescription(); 
     this.furniturized = ap.getFurniturized(); 
     this.id = ap.getId(); 
     this.imageList = ap.getImageList(); 
     this.latitude = ap.getLatitude(); 
     this.longitude = ap.getLongitude(); 
     this.phonenumbers = ap.getPhonenumbers(); 
     this.prepaid = ap.getPrepaid(); 
     this.rentperiod = ap.getRentperiod(); 
     this.rentprice = ap.getRentprice(); 
     this.rooms = ap.getRooms(); 
     this.size = ap.getSize(); 
     this.takeoverdate = ap.getTakeoverdate(); 
     this.usagecost = ap.getUsagecost(); 
     this.zipcode = ap.getZipcode(); 
     runMyParcel(); 
    } 

    private void runMyParcel(){ 
     for (String s :imageList){ 

      URL myFileUrl = null; 
      try { 
       myFileUrl= new URL(s); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } 
      try { 
       HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection(); 
       conn.setDoInput(true); 
       conn.connect(); 
       InputStream is = conn.getInputStream(); 
       Bitmap image = BitmapFactory.decodeStream(is); //Saves the current icon 
       bigBitmapList.add(image); 
       //Icon will now be resized to 125px*100px    
        Bitmap resized; 
        int scalerate = (int)image.getHeight()/60; 
        int newHeight = (int)image.getHeight()/scalerate; 
        int newWidth = (int)image.getWidth()/scalerate; 
        resized = Bitmap.createScaledBitmap(image, newWidth, newHeight, false); 
        smallBitmapList.add(resized); 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
      } 
    } 

    public void setSmallBitmapList(ArrayList<Bitmap> smallBitmapList) { 
     this.smallBitmapList = smallBitmapList; 
    } 


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


    @Override 
    public void writeToParcel(Parcel out, int flags) { 
     out.writeString(id); 
     out.writeString(zipcode); 
     out.writeString(size); 
     out.writeString(rooms); 
     out.writeString(rentprice); 
     out.writeString(deposit); 
     out.writeString(takeoverdate); 
     out.writeString(rentperiod); 
     out.writeString(furniturized); 
     out.writeString(usagecost); 
     out.writeString(addeddate); 
     out.writeString(description); 
     out.writeString(prepaid); 
     out.writeStringList(phonenumbers); 
     out.writeList(bigBitmapList); 
     out.writeList(smallBitmapList); 

    } 

    private ApartmentParcel(Parcel in) { 
     id = in.readString(); 
     zipcode = in.readString(); 
     size = in.readString();  
     rooms = in.readString(); 
     rentprice = in.readString(); 
     deposit = in.readString(); 
     takeoverdate = in.readString(); 
     rentperiod = in.readString(); 
     furniturized = in.readString(); 
     usagecost = in.readString(); 
     addeddate = in.readString(); 
     description = in.readString(); 
     prepaid = in.readString(); 
     in.readStringList(phonenumbers); 
     in.readTypedList(bigBitmapList, Bitmap.CREATOR); 
     in.readTypedList(smallBitmapList, Bitmap.CREATOR); 
    } 

    public static final Creator<ApartmentParcel> CREATOR = new Creator<ApartmentParcel>() { 
     public ApartmentParcel createFromParcel(Parcel in) { 
      return new ApartmentParcel(in); 
     } 

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

ApartmentInfoActivity.java:

package com.android.madsoft.spotter; 

    import android.app.Activity; 
    import android.os.Bundle; 
    import android.widget.TextView; 

    public class ApartmentInfoActivity extends Activity { 


     @Override 
      protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.infoview); 
//  Apartment ap = (Apartment)getIntent().getSerializableExtra("apartment"); 
     Apartment ap = (Apartment)getIntent().getParcelableExtra("app"); 
     TextView zipView = (TextView)findViewById(R.id.txtInfoZip); 
     zipView.setText(ap.getZipcode()); 
    } 

    } 

回答

2

讓您Aparment類實現Serializable

public class Apartment implements Serializable{ 

然後在MyMapOverlayIcon

Bundle b = new Bundle(); 
// WHAT TO DO!? 
b.putSerializable("apartment", ap); 

然後在ApartmentInfoActivity

Apartment ap = (Apartment) getIntent().getSerializableExtra("apartment"); 
+0

我剛試過。 – JReneM 2011-05-02 17:46:43

+0

在ApartmentInfoActivity中,ap爲空 – JReneM 2011-05-02 17:48:42

+0

@cristian你剛剛救了我一天:)謝謝 – 2014-07-14 22:49:00

0

到活動之間共享對象的首選方法是使共享對象Parcelable http://developer.android.com/reference/android/os/Parcelable.html(另請參閱http://developer.android.com/reference/android/os/Parcelable.Creator.html)。然後你可以在某個地方定義一個String鍵,並使用它來在一個Bundle對象中放入和獲取Parcelable物品。

在主要活動:

Intent newActivity = ...; 
Bundle extras = new Bundle(); 

// use your key here to put the parcelable into the bundle 

newActivity.putExtras(extras); 
startActivity(newActivity); 

而且在孩子活動

//child activity (onCreate()) 
Bundle intentExtras = getIntent().getExtras(); 
if(intentExtras != null){ 
    // use the key here to get your parcelable from the bundle 
} 

如果你在你的類的項目,正在實施Parcelable的集合,你可以處理它是這樣的:

import java.util.ArrayList; 
import java.util.Collection; 

import android.graphics.Bitmap; 
import android.os.Parcel; 
import android.os.Parcelable; 

public class ExampleParcelable implements android.os.Parcelable { 

    private final String id; 
    private final ArrayList<Bitmap> bitmapList = new ArrayList<Bitmap>(); 

    public ExampleParcelable(String id, Collection<Bitmap> bitmaps){ 
     this.id = id; 
     this.bitmapList.addAll(bitmaps); 
    } 


    @Override 
    public void writeToParcel(Parcel out, int flags) { 
     // write stack to be duplicated in 'createFromParcel(Parcel in)' 
     out.writeString(id); 
     out.writeList(bitmapList); 
    } 

    @Override 
    public int describeContents() { 
     // your own logic here 
     return 0; 
    } 

    public static final Parcelable.Creator<ExampleParcelable> CREATOR = new Parcelable.Creator<ExampleParcelable>() { 

     @Override 
     public ExampleParcelable createFromParcel(Parcel in) { 
      String id = in.readString(); 
      @SuppressWarnings("unchecked") 
      ArrayList<Bitmap> bitmaps = (ArrayList<Bitmap>)in.readArrayList(Bitmap.class.getClassLoader()); 
      return new ExampleParcelable(id, bitmaps); 
     } 

     @Override 
     public ExampleParcelable[] newArray(int size) { 
      return new ExampleParcelable[size]; 
     } 
    }; 
} 
+0

我已經試過了,但是無法讓它正常工作。是否因爲Apartment對象中存在類ArrayList ? – JReneM 2011-05-02 18:07:44

+0

如果需要,您可以獲取位圖的URI並傳遞該位置,但可以在Parcelable中包含列表。 – 2011-05-02 18:11:38

相關問題