获取 ImageView 的图像并将其发送到带有 Intent 的活动
Posted
技术标签:
【中文标题】获取 ImageView 的图像并将其发送到带有 Intent 的活动【英文标题】:get ImageView's image and send it to an activity with Intent 【发布时间】:2013-07-26 13:53:54 【问题描述】:我的应用中有许多产品的网格。当用户选择网格中的一个项目时,我将启动一个新活动作为对话框框并显示项目的名称、数量和图像。但我无法动态发送图像源。
这是我的代码
gridView.setOnItemClickListener(new OnItemClickListener()
public void onItemClick(AdapterView<?> parent, View v,int position, long id)
//Toast.makeText(getApplicationContext(),((TextView) v.findViewById(R.id.grid_item_label)).getText(), Toast.LENGTH_SHORT).show();
Intent item_intent = new Intent(MainActivity.this, Item.class);
item_intent.putExtra("name",((TextView) v.findViewById(R.id.grid_item_label)).getText());
item_intent.putExtra("quantity",((TextView) v.findViewById(R.id.grid_item_quantity)).getText());
//my problem is here***************************************************
ImageView my_image = findViewById(R.id.grid_item_image).getDrawable();
item_intent.putExtra("image",my_image.getXXXXX());
//*********************************************************************
MainActivity.this.startActivity(item_intent);
);
我应该使用什么来从 ImageView 获取图像源?
【问题讨论】:
两次 getDrawable() 没有意义,尽管这不能解决您的问题。 【参考方案1】:像使用Bundle一样
imageView.buildDrawingCache();
Bitmap image= imageView.getDrawingCache();
Bundle extras = new Bundle();
extras.putParcelable("imagebitmap", image);
intent.putExtras(extras);
startActivity(intent);
Bundle extras = getIntent().getExtras();
Bitmap bmp = (Bitmap) extras.getParcelable("imagebitmap");
image.setImageBitmap(bmp );
【讨论】:
请记住,您会传递大量数据。您还可以传递参考 ID。 A+ 答案。太感谢了。 :)【参考方案2】:您需要使用this 解决方案将drawable转换为Bitmap: 然后你可以通过intent把它传递给下一个activity,因为Bitmap类实现了Parcelable接口。
【讨论】:
【参考方案3】:首先你必须先保存你的图片,然后你可以使用这个方法发送你保存图片的文件名
void Send()
if (file != null)
Intent intent = new Intent(this, Draw.class);
intent.putExtra(PICTURE_FILE_ID, file);
startActivity(intent);
else if (file == null)
Toast tst = Toast.makeText(getApplication(),
"Please Click Save First", Toast.LENGTH_SHORT);
tst.setGravity(Gravity.CENTER, 0, 0);
tst.show();
其他活动
使用mBitmapFile = (File) getIntent().getSerializableExtra(
YourClassName.PICTURE_FILE_ID);
【讨论】:
【参考方案4】:您可以将 Parcable(例如位图)或可序列化对象放在一个包中,然后在其他活动中从该包中检索该对象。
how do you pass images (bitmaps) between android activities using bundles?
虽然我不推荐它,因为您在活动之间传递大量数据。我建议您将图像参考 ID 传递给下一个活动并在那里检索图像。
How to pass the selectedListItem's object to another activity?
编辑:
intent.putExtra("imageId", imageId);
在其他活动中:
int imageRef = getIntent().getIntExtra("imageId", defaultValue);
http://developer.android.com/reference/android/content/Intent.html#getIntExtra%28java.lang.String,%20int%29
【讨论】:
【参考方案5】:在活动之间传递位图数据时,我通常更喜欢将其存储在扩展的Application 类中,您可以从所有活动中访问该类。您显然可以像其他人所说的那样,通过在 Intent 上传递它来做到这一点,但是如果您在多个活动中需要它,将它存储在应用程序中会给您更大的灵活性。
【讨论】:
【参考方案6】:您可以将您的可绘制对象转换为位图,然后转换为字节数组,并有意地传递此字节数组。
Drawable d;
Bitmap b= ((BitmapDrawable)d).getBitmap();
int bytes = b.getByteCount();
ByteBuffer buffer = ByteBuffer.allocate(bytes);
b.copyPixelsToBuffer(buffer);
byte[] array = buffer.array();
使用此代码:
通话活动...
Intent i = new Intent(this, NextActivity.class);
Bitmap b; // your bitmap
ByteArrayOutputStream bs = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.PNG, 50, bs);
i.putExtra("byteArray", bs.toByteArray());
startActivity(i);
...在你的接收活动中
if(getIntent().hasExtra("byteArray"))
ImageView previewThumbnail = new ImageView(this);
Bitmap b = BitmapFactory.decodeByteArray(
getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length);
【讨论】:
如何转换?【参考方案7】:我遇到了同样的问题,并通过意图传递所选项目的位置来解决它。正如我认为并从堆栈专业人士那里读到的那样,它是最好的解决方案。 只需在包含 GridView 的 FirstActivity.java 中执行此操作
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id)
Intent intent = new Intent(getActivity(),DetailActivity.class);
intent.putExtra("id",position);
startActivity(intent); );
然后在您的目标 Activity 中,您必须从 extras 中获取位置并将其从您的数据库或图像数组的投射位置中提取:
Intent intent = getActivity().getIntent();
int position = intent.getIntExtra("id",0);
ImageAdapter imageAdapter = new ImageAdapter(getActivity());
ImageView imageView = (ImageView)rootView.findViewById(R.id.movie_detail_image);
imageView.setImageResource((int)imageAdapter.getItem(position));
您必须编辑图像适配器的 getItem 方法以返回选定的图像 ID。
【讨论】:
以上是关于获取 ImageView 的图像并将其发送到带有 Intent 的活动的主要内容,如果未能解决你的问题,请参考以下文章
通过 AsyncTask 下载图像并将其显示在 Imageview 中而不存储在 sdcard 中
Android:无法从mysql数据库中检索图像URL并将其显示在imageView中
如何在 javafx imageView 中获取显示图像的宽度/高度?