2014年4月2日 星期三

Android 開發 (三十八) facebook friendPicker

FriendPickerFragment 是 facebook sdk內含的fragment,初始化這個fragment必須擁有幾個參數
        intent.putExtra(FriendPickerFragment.USER_ID_BUNDLE_KEY, userId);
        intent.putExtra(FriendPickerFragment.MULTI_SELECT_BUNDLE_KEY, multiSelect);
        intent.putExtra(FriendPickerFragment.SHOW_TITLE_BAR_BUNDLE_KEY, showTitleBar);

userId 為顯示哪個user的朋友,預設為登入本人  (null)
multiSelect 是否可以多選
SHOW_TITLE_BAR_BUNDLE_KEY 文件並沒有解釋,如果設為false 就不會出現 Choose Friends的title 以及 done的按鈕,如下圖。



在進入Picker頁面時必須將  friendPickerFragment.loadData(false); 設為false,這樣才會開始load friend list,使用getSelection讓我們可以取得選取的friendList,在我們選取完成後,接著必須專注在如何將資料傳回呼叫端。

使用startActivityForResult讓我們在選取完成並按下done之後可以將資料回傳給呼叫者,
但是在這邊會遇到一個問題,List<GraphUser> 並不能利用 intent 傳送資料
所以在 facebook的sample code裡面,利用了application來傳遞資料,
我覺得這不是一個很好的解決方案,所以花了點時間去思考較好的方法,
讓我們看看下面的sample Code


             Intent intent = new Intent();
             ArrayList<String> vals = new ArrayList<String>();
             for(GraphUser user: friendPickerFragment.getSelection()){
              vals.add(user.getInnerJSONObject().toString());
             }
 
             
             intent.putStringArrayListExtra("list",vals);
                setResult(RESULT_OK, intent);
                finish();

利用getInnerJSONObject().toString() 將資料轉成String 並且利用 putStringArrayListExtra將資料放進intent以便於傳送至呼叫者,在呼叫端利用下面的程式碼還原

  List<String> vals= new ArrayList<String>();
      vals = data.getStringArrayListExtra("list");
      String result="";
  try {
   for (String val : vals) {
    JSONObject jsonObj;
    jsonObj = new JSONObject(val);

    GraphUser user = GraphObject.Factory.create(jsonObj,
      GraphUser.class);
    result += user.getName()+"\n";
    Log.d("Ted", user.getName());
   }
  } catch (JSONException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
將取得的String轉成JSONObject之後,再利用GraphObject.Factory 轉回GraphUser,
這樣我們就可以取得原本的資料了(雖然要經過一小段的轉換)。

最近又有機會接觸 facebook sdk ,我想之後應該還會有幾篇相關的介紹吧!!

沒有留言:

張貼留言