6

我已经完成了Android 版 Facebook SDK的教程(尤其是“Show Friends”-tutorial)。

当我再次单击“显示朋友”按钮时,如何标记我之前在 PickerActivity 中选择的选定用户?

4

5 回答 5

3

我查看了 Facebook SDK 的源代码,在我看来,PickerFragment您似乎无法重新选择以前选择的项目。由于 Facebook SDK 是在 Apache License 2.0 下发布的,并且您可以访问完整的源代码,我想您可以尝试以PickerFragment具有必要方法的方式进行修改。

于 2013-01-30T20:46:22.383 回答
2

您必须将包中带有选定 facebook 用户 ID 的逗号分隔字符串传递给 FriendPickerFragment。

Bundle args = new Bundle();
args.putString("com.facebook.android.PickerFragment.Selection", "11111, 2222, 333, already selected facebook ids....");
friendPickerFragment = new FriendPickerFragment(args);

在 PickerFragment 的 onActivityCreated() 中,它将解析所选 id 显示为在列表中选择。您可以在 FacebookSDK 的 PickerFragment 中看到以下代码。

selectionStrategy.readSelectionFromBundle(savedInstanceState, SELECTION_BUNDLE_KEY);
于 2013-02-06T05:57:10.087 回答
1

这是一个对我有用的解决方案。我扩展了一个标准的 FriendPickerFragment。

public class FriendPickerFragment2 extends FriendPickerFragment {

SelectionStrategy selectionStrategy;
String mPreSelectedIDs;

public FriendPickerFragment2(Bundle args)
{
    super(args);
}

@Override
SelectionStrategy createSelectionStrategy() {
    selectionStrategy = getMultiSelect() ? new MultiSelectionStrategy() : new SingleSelectionStrategy();
    return selectionStrategy;
}

public void showInitialSelection()
{
    Bundle bundle = new Bundle();
    bundle.putString(this.MULTI_SELECT_BUNDLE_KEY, mPreSelectedIDs);
    selectionStrategy.readSelectionFromBundle(bundle, this.MULTI_SELECT_BUNDLE_KEY);
    adapter.notifyDataSetChanged();
}

public void setInitialSelection(String IDs)
{
    mPreSelectedIDs = IDs;
}

}

我将 FriendPickerFragment2 用作普通的 FriendPickerFragment。在 OnCreate 我执行以下操作:

        FragmentManager fm = getSupportFragmentManager();

    if (savedInstanceState == null) {
        final Bundle args = getIntent().getExtras();
        friendPickerFragment = new FriendPickerFragment2(args);
        friendPickerFragment.setInitialSelection(pickedUsersString());

        fm.beginTransaction()
                .add(R.id.friend_picker_fragment, friendPickerFragment)
                .commit();
    } else {
        friendPickerFragment = (FriendPickerFragment2) fm.findFragmentById(R.id.friend_picker_fragment);
    }

这里pickUsersString 是一个逗号分隔的ID 字符串。

最后一点是在 OnStart 中添加一行:

protected void onStart() {
    super.onStart();
    try {

        friendPickerFragment.loadData(false);
        friendPickerFragment.showInitialSelection();
    } catch (Exception ex) {
        onError(ex);
    }
}

这个解决方案对我有用。

于 2013-09-06T01:06:04.407 回答
0

好消息。在当前的 SDK 版本 (3.6) 中,添加了以下功能:

  • 在 FriendPickerFragment 上添加了 setSelection 方法以允许预选朋友。
  • 在 Friend Picker Sample 中添加了 setSelection API 的使用示例
于 2014-01-04T09:21:41.830 回答
0

FriendPickerFragment 有这个方法:

/**
 * Sets the list of friends for pre selection. These friends will be selected by default.
 * @param userIds list of friends as ids
 */
public void setSelectionByIds(List<String> userIds) {
    preSelectedFriendIds.addAll(userIds);
}

而这个方法:

public void setSelection(List<GraphUser> graphUsers) {
    List<String> userIds = new ArrayList<String>();
    for(GraphUser graphUser: graphUsers) {
        userIds.add(graphUser.getId());
    }
    setSelectionByIds(userIds);
}

您应该在片段实例化后立即调用这些方法之一:

    friendPickerFragment = new FriendPickerFragment(args);
    friendPickerFragment.setSelectionByIds(fbIDs);
于 2014-04-29T17:50:08.810 回答