如何在两个Activity之间传递位图

5
我可以帮助您进行翻译。以下是您需要翻译的内容:

我在 ActivityA 中有一个位图,我想将这个位图从这里传递到 ActivityB,我对此进行了 Google 搜索。当我使用以下代码时:

Intent intent = new Intent(this, NewActivity.class);
intent.putExtra("BitmapImage", bitmap);

获取信息

Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage");

我遇到了这个错误:!!!FAILED BINDER TRANSACTION!!!。我该如何解决这个问题?

你说的“有时候可以工作,但不总是”是什么意思?你在屏幕上看到了哪些影响(或者如果出现错误,你在logcat中看到了哪些影响)? - STT LCU
请检查我的答案,已经编辑过了。你也可以使用Application类。 - Lalit Poptani
这将有助于https://dev59.com/2mvXa4cB1Zd3GeqPIFnj。 - Manish
4个回答

13

您的代码在将位图放入extras中方面是正确的,并且对于我来说使用小图像效果良好。

但似乎Parcelable extra存在大小限制。请参见http://groups.google.com/group/android-developers/browse_thread/thread/7322a84adcfee567?pli=1

您可能希望先存储图像,然后只交出存储位置的URI。

编辑:根据udaykiran的建议使用公共静态字段来存储位图违反了许多OO原则,我甚至不知道从哪里开始。


感谢您的编辑。我已经给那两个建议它们的答案投了反对票并留下了严厉的评论,这是我从未做过的,因为它们实在太糟糕了。我希望我能再点赞几次。 - salezica

3

我尝试了以下的代码,使用 intent.putExtra("name", bitmap)

在传递 intent 时,

Intent intent = new Intent(Current.this, Next.class);
intent.putExtra("bmp", bitmap);
startActivity(intent);

在获取数据时,

Bitmap bitmap = getIntent().getParcelableExtra("bmp");

或者

另一个选项是使用 Application 类,

你也可以使用一个继承 Application 的类,并拥有一个 Bitmap 的 setter 和 getter 方法,在每个 Activity 中调用它。

((myApplication_class_name)getApplication()).setBitmap(bmp);

使用以下方法获取Bitmap:

((myApplication_class_name)getApplication()).getBitmap();

我按照您说的创建了,但在ActivityB中没有得到。 - NagarjunaReddy
我在ActivityA中声明了一个私有静态位图b;尝试在这个类中获取位图,代码为:Bitmap a = ImageAfterCrop.b; - NagarjunaReddy
你必须声明为public static而不是private static。 - Lalit Poptani
我可以在我的ActivityB中声明这个公共静态位图b吗? - NagarjunaReddy
抱歉,将位图静态存储在内存中只是一种糟糕的编码方式。这样做很可能会导致内存泄漏。请将图像存储在临时缓存中,并传递 URI。 - Reno
2
这是糟糕的设计,不是解决方案而是一种变通方法,显然OP缺乏足够的知识来判断。我很少会点踩,但是得了吧... - salezica

1

我认为那不是正确的方法... 你可以使用这个链接来实现该功能。我自己也用过类似的东西。


-5

你可以先将你的Bitmap命名为static

然后创建一个方法,例如:

public static Bitmap getBitmap(){
return bitmap;
}

然后你可以从其他活动中简单地调用它,

bitmapwantedclass.getBitmap();

希望能有所帮助


我按照你说的做了,但在所需的类中出现错误。方法getBitmapCrop()对类型ImageAfterCrop未定义。 - NagarjunaReddy
你必须这样调用,假设你的位图在A类中,并且getBitmap也在A类中,你想要在B类中使用该位图,因此你必须在B类中调用A.getBitmap()。 - Uday
17
这是糟糕的设计,不是解决方案而是一种变通方法,而且提问者显然没有足够的知识来判断。我很少给负评,但是拜托了... - salezica
他为什么被踩了?虽然这不是一个好的设计,但是标准的写入磁盘再提取的方式对于高分辨率照片来说非常慢,即使在像Nexus II这样的新手机上测试也是如此。 - Math is Hard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接