美好的一天,
我被分配到公司内部的一个Android项目,我有点挣扎。几年后我没有触及过Android。想你可能能帮我找到我所缺少的东西。
我有一个项目调用外部库来读取条形码,然后代码对字节数组进行解析并将其转换为对象。我遇到的问题是我的MainActivity和扫描条形码的活动之间的通信。
这是调用我的条形码阅读器活动的代码:
setContentView(R.layout.activity_main);
MyObjectActivity.setParentActivity(this);
Intent intent = new Intent(this, MyObjectActivity.class);
startActivityForResult(intent, 0);
这个应该将扫描数据从MyObjectActivity对象升级到我的MainActivity(所以我实际上可以对数据做些什么)。
try
{
//MyObject objet contains child objects
MyObject content = MyObjectParser.retrieveContentData(data /*contains the byte array*/);
Intent data_toreturn = new Intent();
data_toreturn.putExtra("data_sent", true);
data_toreturn.putExtra(BARCODE_DATA_EXTRA_TAG, content);
if (getParent() == null)
{
setResult(RESULT_OK, data_toreturn);
} else
getParent().setResult(RESULT_OK, data_toreturn);
} catch(final RuntimeException e)
{
parentActivity.runOnUiThread(new Runnable()
{
@Override
public void run()
{
Toast.makeText(parentActivity, e.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
// stop the Activity
finish();
调试时我设法运行所有代码直到完成()。然后我得到了例外
将结果ResultInfo {who = null,request = 0,result = -1,data = Intent {(has extras)}}传递给activity {MyObjectActivity}:java.lang.ClassCastException:java.lang.Object []无法转换为ChildObject []
根据我在android中开发的记忆,为了能够在活动之间传递对象,你需要意图和可以Parcelable或Serializable的对象(不确定这个)。我已经审查了代码和子对象DO实现这一点。
我真的不知道如何继续。这可能是一个配置,或者我做了一些非常错误的事情,我没有看到它。
感谢您的回复。
答案 0 :(得分:1)
所以我看到你正在使用
startActivityForResult(intent,Yournumber)//我不会使用0,使用1001或更多自定义。 这样你就可以成为已发布活动的父级。 那你为什么要做setParentActivity调用呢?我假设你做的吐司?似乎是处理这种情况的不健康方式,但这是一个不同的问题。
然后覆盖该父活动中的onActivityResult以处理返回的intent数据。我相信你已经完成了。
但我不确定你的“内容”对象,如果它是可以包容的。您可以通过简单地注释掉“将其添加到意图”并查看当该对象不在意图内时它是否被传递来进行检查。
如果它被传递,那么你应该确保你的对象实现Parceable,以便它可以放入意图中。如果仍然没有交付,那么看起来你的父母没有以某种方式指向正确的类有问题,我们需要看到更多的代码来帮助解决这个问题。
我看到你正在传递原始字节,这应该可以正常工作,但你可以尝试一个包装器对象,它实现了parceable,它将字节保存为成员,并将该对象作为最后的沟通工具传回。 / p>
答案 1 :(得分:0)
假设您通过活动A中的显式意图向活动B发送对象X.
第1步 - 确保您的类X实现Serializable接口(您说已经拥有)。还要确保Object X中的所有其他对象都实现了Serializable接口。
第2步 - 在您的活动A中的某个地方,您有类似的代码:
X objectX = new X();
Intent intent = new Intent(A.this, B.class);
intent.putExtra("myObject", objectX);
startActivity(intent);
步骤3 - 在您的活动B中,您将获得Object引用并将其转换为X:
Intent intent = getIntent();
X objectX = (X)intent.getSerializableExtra("myObject");
希望这会有所帮助。这是在活动之间传递对象的基本模式,没有更多内容。