2014-02-28 40 views
2

我是一個使用Java和Android編程的全新手。活動與來自一個活動的setResult()和來自另一個活動的onActivityResult()之間的通信

我所擁有的是一個活動,它通過點擊一個按鈕啓動一個不同的活動與一個選擇框(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> ? 
    } 
} 

或者我是否完全錯誤?

回答

4

我檢查了文檔,不幸的是GraphUser不可序列化。你能做的就是從列表轉換調用的setResult之前列出:

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

+0

謝謝你,這工作幾乎完美無瑕。一些更正可能用於將來的參考:intent.putStringArrayListExtra而不是intent.putExtra,List list = new ArrayList ();而不是名單 list = new List ();和user =(GraphUser)GraphObject.Factory.create(new JSONObject(tmpString),GraphUser.class);而不是user =(GraphUser)GraphObject.Factory。創建(新的JSONObject(tmpString)); 但在這一點上,只有一些小事情要解決,再次感謝您的幫助! –

+0

不客氣 – Blackbelt

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。

0

如果您想保留相同的引用,並且序列化對您是個問題,您也可以使用Application對象傳輸數據。

相關問題