how to pass Bitmap array between 2 activities

2019-07-18 02:25发布

问题:

I have been trying to pass bitmap array to another Activity for a week but I still can't do it

public class HomePage extends Activity {
private GridView gridView;
public Bitmap[] mBitArray;
public Bitmap[] mBitArray5;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home_page);
    gridView = (GridView) findViewById(R.id.GridView1);
    mBitArray = new Bitmap[7];
    try
    {
        //these images are stored in the root of "assets"
        mBitArray[0] = getBitmapFromAsset("Gallary/g1p1.jpg");
        mBitArray[1] = getBitmapFromAsset("Gallary/g1p2.jpg");
        mBitArray[2] = getBitmapFromAsset("Gallary/g1p3.jpg");
        mBitArray[3] = getBitmapFromAsset("Gallary/g1p4.jpg");
        mBitArray[4] = getBitmapFromAsset("Gallary/g1p5.jpg");
        mBitArray[5] = getBitmapFromAsset("Gallary/g1p6.jpg");
        mBitArray[6] = getBitmapFromAsset("Gallary/g2p1.jpg");
       mBitArray[7] = getBitmapFromAsset("g2p2.jpg");
        mBitArray[8] = getBitmapFromAsset("hd-01.jpg");
        mBitArray[9] = getBitmapFromAsset("hd-02.jpg");
        mBitArray[10] = getBitmapFromAsset("hd-03.jpg");
        mBitArray[11] = getBitmapFromAsset("hd-04.jpg");
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

     gridView.setAdapter(new ImageAdapter(this, mBitArray));
      gridView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int       position,
                long id) {

            Intent i = new Intent(getApplicationContext(),       FullImageActivity.class);
            i.putExtra("id", position);
            startActivity(i);           
            // TODO Auto-generated method stub

        }
    });
}



public Bitmap getBitmapFromAsset(String strName) throws IOException {
    AssetManager assetManager = getAssets();
    InputStream istr = assetManager.open(strName);
    Bitmap bitmap = BitmapFactory.decodeStream(istr);
    istr.close();
    return bitmap;

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_home_page, menu);
    return true;
}

}






 public class ImageAdapter extends BaseAdapter {
 private Context mContext;
 private Bitmap[] mImageArray;


public ImageAdapter(Context context, Bitmap[] imgArray)
{
    mContext = context;
    mImageArray = imgArray;
}

public int getCount() {

    return mImageArray.length;
}

public Object getItem(int position) {
    // TODO Auto-generated method stub
    return mImageArray[position];
}


public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {         
    ImageView imageView = new ImageView(mContext);
    imageView.setImageBitmap(mImageArray[position]);
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    imageView.setLayoutParams(new GridView.LayoutParams(153, 150));
    return imageView;
}

public Bitmap getView1(int position) throws IOException {   

    AssetManager am = mContext.getAssets();
    String[] list = am.list("Gallary");
     BufferedInputStream buf = new               BufferedInputStream(am.open(list[position]));

     Bitmap bitmap = BitmapFactory.decodeStream(buf);

 buf.close();
    return bitmap;
}

}

public class FullImageActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fullimage);
    ImageView imageView = (ImageView) findViewById(R.id.full_image_view);
     Intent i = getIntent();
     int position = i.getExtras().getInt("id");


     ImageAdapter imageAdapter = new ImageAdapter(this , null);


    //imageView.setImageBitmap(mBitArray[position]);
    trying to get mBitarray to fullscreenactivity to display a certain picture from the bitmap array

so I want to pass MbitArray variable to Fullactivity class I tried to do it by Intent but I can't send Bitmap array maybe via constructor or inner class?

回答1:

Since Bitmap implements Parcelable, and you have an array of Bitmap, you should be able to pass them off:

Intent i = new Intent(getApplicationContext(), FullImageActivity.class);
i.putExtra("bitmaps", mBitArray);
startActivity(i);  

Then retrieve via getParcelableArrayExtra():

Intent i = getIntent();
Bitmap [] bitmaps = (Bitmap[]) i.getParcelableArrayExtra ("bitmaps");

You can also pass off the paths in a String array to FullImageActivity, then just remake them there, much like you did in your first Activity. To save code, if you choose this approach, making the method shared by making it static would be a good idea, just remember to pass off a Context instance so getAssets() can still be used:

public static Bitmap getBitmapFromAsset(Context context, String strName) throws IOException {
    AssetManager assetManager = context.getAssets();
    InputStream istr = assetManager.open(strName);
    Bitmap bitmap = BitmapFactory.decodeStream(istr);
    istr.close();
    return bitmap;
}

Then to call, from HomePage

mBitArray[0] = getBitmapFromAsset(this,"Gallary/g1p1.jpg");

and from FullImageActivity

otherBitmapArray[0] = HomePage.getBitmapFromAsset(this, bitmapPaths[0]);