【问题标题】:How to send images form an Activity to another Activity?如何将图像从一个活动发送到另一个活动?
【发布时间】:2011-11-24 01:05:16
【问题描述】:

我正在尝试制作一个具有 2 个Activities 的应用程序。 Activity1 是画廊,可以致电Activity2Activity2 是一个相机应用程序,它可以捕获图像,然后将这些图像发送到Activity1Activity1 将在图库中显示这些图像。我无法在两个Activities 之间发送图像。

此代码是我在Activity1 中的画廊。我知道SerializebleBitmap,但在我的代码中,我怎样才能把它放在画廊列表中?这是我的代码:

public class HelloGallery extends Activity {
private Gallery gallery;
private ImageView imgView;
private Button btn;
private static final int SHOW_SUB_FORM = 0;
private String[] imglist;
Bundle extras = getIntent().getExtras();
private Integer[] mImageIds = {
        R.drawable.sample_0,
        R.drawable.sample_1,
        R.drawable.sample_2,
        R.drawable.sample_3,
        R.drawable.sample_4,
        R.drawable.sample_5,
        R.drawable.sample_6,
        R.drawable.sample_7
};
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  gallery = (Gallery) findViewById(R.id.gallery);
    gallery.setAdapter(new ImageAdapter(this));
   imgView = (ImageView)findViewById(R.id.ImageView01); 
    imgView.setImageResource(mImageIds[0]);

    btn = (Button) findViewById(R.id.Takept);


       btn.setOnClickListener(new View.OnClickListener(){




        public void onClick(View v) {

            btn_onClick();
        }

    }); 



    if (extras != null){

        String[] imglist= extras.getStringArray("IMAGE_LIST");
        imgView.setImageResource(mImageIds[0]);


    }

    gallery.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView parent, View v, int position, long id) {
            Toast.makeText(HelloGallery.this, "" + position, Toast.LENGTH_SHORT).show();
            imgView.setImageResource(mImageIds[position]);




        }
    });


};

private void btn_onClick() {

    Intent intent = new Intent(HelloGallery.this,CameraDemo.class);


    startActivity(intent);
} 

public class ImageAdapter extends BaseAdapter {
    int mGalleryItemBackground;
    private Context mContext;


    public ImageAdapter(Context c) {
        mContext = c;
        TypedArray attr = mContext.obtainStyledAttributes(R.styleable.HelloGallery);
        mGalleryItemBackground = attr.getResourceId(
                R.styleable.HelloGallery_android_galleryItemBackground, 0);
        attr.recycle();
    }

    public int getCount() {
        return mImageIds.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView = new ImageView(mContext);

        imageView.setImageResource(mImageIds[position]);
        imageView.setLayoutParams(new Gallery.LayoutParams(100, 100));
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
        imageView.setBackgroundResource(mGalleryItemBackground);

        return imageView;
    }
}
}

【问题讨论】:

标签: android


【解决方案1】:

一般来说,您不希望将图像从一个活动发送到另一个活动。您将希望活动 1 将其存储在某个地方,然后告诉活动 2 去访问它。可能在两个 Activity 都可以访问的另一个基础应用程序类中。

希望对你有帮助

【讨论】:

    【解决方案2】:

    在您的意图中,您有可能传递 Serializable 对象。

    这样做,您必须像这样创建一个用于序列化/反序列化图像的类:

        import java.io.ByteArrayOutputStream;
        import java.io.IOException;
        import java.io.Serializable;
    
        import android.graphics.Bitmap;
        import android.graphics.BitmapFactory;
        import android.graphics.Bitmap.CompressFormat;
    
        public class SerializableBitmap implements Serializable {
           private static final long serialVersionUID = 1208813848065674061L;
           private Bitmap bitmap;
           // Serialize image
           private void writeObject(java.io.ObjectOutputStream out) throws IOException {
              ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
              bitmap.compress(CompressFormat.JPEG, 100, bos); 
              byte[] bitmapdata = bos.toByteArray();
              out.write(bitmapdata, 0, bitmapdata.length);
           }
    
           // Deserialize image
           private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
               ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
               int b;
               while((b = in.read()) != -1)
                  byteStream.write(b);
               byte bitmapBytes[] = byteStream.toByteArray();
               bitmap = BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.length);
           }
    
           public Bitmap getBitmap() {
              return bitmap;
           }
    
           public void setBitmap(Bitmap bitmap) {
              this.bitmap = bitmap;
           }
       }
    

    免费使用 setBitmap() 和 getBitmap() 方法来序列化/反序列化您的位图,并在您的意图中放置可序列化的位图对象:

        intent.putExtra(extraDataKey, serializableBitmap);
    

    但请考虑,如果图像太大,此解决方案可能会导致性能问题。

    希望对您有所帮助。

    【讨论】:

    • Bitmap已经实现了Parcelable,直接将bitmap传给intent.putExtra(),不需要再次包裹。
    • 那么我如何在activity1的galleyry上显示这些图像?
    • @user1063009 位图图像 = (Bitmap) getIntent().getExtras().getParcelable(extraDataKey);
    • 是的,它可以工作。但我确认使用 SerializableBitmap 的解决方案对我来说效果很好。如果 Parcelable 可以完成这项工作,我会尝试。谢谢你。
    • @user1063009: 如果你有 ImageView 那么你可以这样做:imageView.setImageBitmap(bitmap);
    【解决方案3】:

    您发送图像的位置,例如“R.drawable.sample_0”,您将其作为字符串发送,然后当您在活动 2 中获取它时,您可以从您的 drawables 中访问它。这一切都不需要发送图像:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 2012-07-20
      • 1970-01-01
      • 2023-03-28
      • 2016-08-18
      相关资源
      最近更新 更多