关于SO也有类似的问题,但没有一个对我有用。
我想在Activity1中获取点击的图像并将其显示在Activity2中。
我正在获取点击图像的图像ID,如下所示:
((ImageView) v).getId()
并将意图传递给另一项活动。
在第二项活动中,我使用图片ID如下:
imageView.setImageResource(imgId);
我在两个活动中都记录了值og image id。它是相同的。
但是我得到了以下异常:
android.content.res.Resources$NotFoundException: Resource is not a Drawable
(color or path): TypedValue{t=0x12/d=0x0 a=2 r=0x7f050000}
我想这里的问题是getId()
返回ImageView
的ID和不是它的源图像。
所有这些图像都出现在drawable
。
任何帮助表示感谢。
答案 0 :(得分:21)
有3种解决方案可以解决这个问题。
1)首先将图像转换为字节数组然后传入Intent,然后在下一个活动中从Bundle获取字节数组并转换为图像(位图)并设置为ImageView。
将位图转换为字节数组: -
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
将字节数组传递给intent: -
Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("picture", byteArray);
startActivity(intent);
从Bundle获取字节数组并转换为位图图像: -
Bundle extras = getIntent().getExtras();
byte[] byteArray = extras.getByteArray("picture");
Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
ImageView image = (ImageView) findViewById(R.id.imageView1);
image.setImageBitmap(bmp);
2)首先将图像保存到SDCard中,然后在下一个活动中将此图像设置为ImageView。
3)将Bitmap传递给Intent并从bundle获取下一个活动中的位图,但问题是如果你的Bitmap / Image大小很大,那么下一个活动中的图像就不会加载。
答案 1 :(得分:5)
这不起作用。你必须这样试试。
将ImageView的DrawingCache设置为true,然后将背景保存为Bitmap并通过putExtra传递。
image.setDrawingCacheEnabled(true);
Bitmap b=image.getDrawingCache();
Intent i = new Intent(this, nextActivity.class);
i.putExtra("Bitmap", b);
startActivity(i);
在你的下一个活动中,
Bitmap bitmap = (Bitmap) intent.getParcelableExtra("Bitmap");
imageView.setImageBitmap(bitmap);
答案 2 :(得分:0)
在Drawable
类中定义一个Application
静态变量,然后在第一个活动中设置可绘制图像的数据,然后在下一个活动中,从在{{1 }}类。
Application
第一次活动:
public class G extends Application {
public static Drawable imageDrawable;
...
}
SecondActivity:
G.imageDrawable = imageView.getDrawable();
和onDestroy:
imgCamera.setImageDrawable(G.imageDrawable);
注意:您必须在清单中定义@Override
protected void onDestroy() {
G.imageDrawable = null;
super.onDestroy();
}
类:
Application
答案 3 :(得分:0)
如果您要从类似addapter类的类移出,请使用此代码。
Bitmap bitImg=listItem.getBitmapImage();
ByteArrayOutputStream baoS = new ByteArrayOutputStream();
bitImg.compress(Bitmap.CompressFormat.JPEG, 50, baoS);
intent.putExtra("bitArray", baoS.toByteArray());
context.getApplicationContext().startActivity(intent);
然后将其传递到下一个活动
if(getIntent().hasExtra("bitArray")) {
Bitmap bitM = BitmapFactory.decodeByteArray( getIntent().getByteArrayExtra("bitArray"),0,getIntent().getByteArrayExtra("bitArray").length);
imgIT = findViewById(R.id.img_detail);
imgIT.setImageBitmap(bitM);
}
答案 4 :(得分:-1)
简而言之,这是完美的方式。 这是发件人.class文件的代码
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher;
Intent intent = new Intent();
Intent.setClass(<Sender_Activity>.this, <Receiver_Activity.class);
Intent.putExtra("Bitmap", bitmap);
startActivity(intent);
这是接收器类文件代码。
Bitmap bitmap = (Bitmap)this.getIntent().getParcelableExtra("Bitmap");
ImageView viewBitmap = (ImageView)findViewById(R.id.bitmapview);
viewBitmap.setImageBitmap(bitmap);
无需压缩。 那是