活动与来自一个活动的setResult()和来自另一个活动的onActivityResult()之间的通信

时间:2014-02-28 13:15:14

标签: java android android-intent android-activity

我是Java和Android编程的新手。

我所拥有的是一个活动,点击一个按钮后,它会启动一个与selectbox(facebook的friendpicker)不同的活动。

我想要做的是,在选择我想要的用户后,在第一个活动中显示它们。 作为第二个目标,我会尝试为每个用户创建一个按钮。但首先我只是将信息从一个活动传递到另一个活动。

我认为setResult()和onActivityResult()将是我正确的选择。我不知道如何以及为什么要这样做。

所以在我的第二个活动中,这包含了我想要的所有用户:

List<GraphUser> friendList = friendPickerFragment.getSelection();

但这显然不起作用:

setResult(RESULT_OK, (Intent) friendListToPlay);
finish();

如何将我的GraphUser对象列表添加到此意图中?

然后在我的第一个活动(当然称为第二个活动)我有onActivityResult,我如何再次从Intent中获取List?

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REAUTH_ACTIVITY_CODE) {
      uiHelper.onActivityResult(requestCode, resultCode, data);

    } else if (resultCode == Activity.RESULT_OK) {

      // Intent data to List<GraphUser> ?
    }
}

或者我完全错了吗?

3 个答案:

答案 0 :(得分:4)

我检查了文档,遗憾的是GraphUser不可序列化。你可以做的是在调用setResult之前从List转换为List:

List<String> tmpList = new ArrayList<String>();
for (GraphUser tmp : friendList) {
  tmpList.add(tmp.getInnnerJSONObject().toString());
}
Intent intent = new Intent();
intent.putExtra("list", tmpList);
setResult(RESULT_OK, intent);
finish();

在onActivityResult上,您可以回读数据:

  else if (resultCode == Activity.RESULT_OK) {

   List<String> tmpList = intent.getExtra("list");
   List<GraphUser> list = new ArrayList<GraphUser>();
   for (String tmpString : tmpList) {
       GraphUser user = (GraphUser) GraphObject.Factory.create(new JSONObject(tmpString), ,GraphUser.class);
       list.add(user);
   }
}

检查typo/null values/correct cast

答案 1 :(得分:1)

您不能只在Intent对象中投射列表。相反,你必须把它放在:

Intent intent = new Intent();
intent.putExtra("foobar", friendListToPlay);
setResult(RESULT_OK, intent);
finish();

回到你的第一个活动:

List<GraphUser> friendListToPlay = (Serializable) intent.getSerializableExtra("foobar");

显然GraphUser类必须实现Serializable接口。如果不是这种情况,只需存储String表示形式,例如使用JSON。

答案 2 :(得分:0)

如果您想保留相同的引用并且序列化对您来说是个问题,您也可以使用Application对象来传输数据。