如何在 2 个活动之间传递位图数组

Jos*_*h27 2 android bitmap android-intent

我一直试图将位图数组传递给另一个活动一个星期,但我仍然无法做到

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;
}
Run Code Online (Sandbox Code Playgroud)

}

公共类 FullImageActivity 扩展 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
Run Code Online (Sandbox Code Playgroud)

所以我想将 MbitArray 变量传递给 Fullactivity 类我试图通过 Intent 来做,但我无法通过构造函数或内部类发送位图数组?

A--*_*--C 5

由于Bitmap实现了 Parcelable,并且您有一个 Bitmap 数组,您应该能够将它们传递出去:

Intent i = new Intent(getApplicationContext(), FullImageActivity.class);
i.putExtra("bitmaps", mBitArray);
startActivity(i);  
Run Code Online (Sandbox Code Playgroud)

然后通过检索getParcelableArrayExtra()

Intent i = getIntent();
Bitmap [] bitmaps = (Bitmap[]) i.getParcelableArrayExtra ("bitmaps");
Run Code Online (Sandbox Code Playgroud)

您还可以将 String 数组中的路径传递给FullImageActivity,然后在那里重新制作它们,就像您在第一个活动中所做的那样。为了节省代码,如果您选择这种方法,通过将其设为静态来共享方法将是一个好主意,只需记住传递一个 Context 实例,以便getAssets()仍然可以使用:

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;
}
Run Code Online (Sandbox Code Playgroud)

然后打电话,从 HomePage

mBitArray[0] = getBitmapFromAsset(this,"Gallary/g1p1.jpg");
Run Code Online (Sandbox Code Playgroud)

并从 FullImageActivity

otherBitmapArray[0] = HomePage.getBitmapFromAsset(this, bitmapPaths[0]);
Run Code Online (Sandbox Code Playgroud)

  • @system32 就像传输的任何东西一样,大小越大,性能受到的影响就越大。但是,Parcelable 比 Serializable 更有效,因此从某种意义上说,这仍然“更好”。但是它如何承受从路径中重新读取,这取决于设备和位图大小。 (2认同)
  • @JRowan 请记住,如果将模型对象、位图或原始类型放入“Bundle”,则会生成副本。 (2认同)
  • @JRowan 保持静态意味着它属于 dalvik 实例 - 如果它们都访问相同的静态数组,`A` 中的修改将反映在 `B` 中。制作 Parcel 不会保留引用(这仍然是“序列化”的一种方式),并且每个数组都是 Activity 的本地数组。 (2认同)