Android - Facebook SDK - FriendPicker setSelected 不起作用
Posted
技术标签:
【中文标题】Android - Facebook SDK - FriendPicker setSelected 不起作用【英文标题】:Android - Facebook SDK - FriendPicker setSelected not working 【发布时间】:2014-09-09 10:06:49 【问题描述】:我刚刚使用 Facebook 为 android 提供的 SDK 实现了好友选择器。一切似乎都运行良好,除非用户想要返回选择器并编辑他们的朋友选择。我能够获取先前选择的朋友,并在friendPickerFragment 上调用setSelection(它接收List 对象,通过Log.d 确认)。但是,朋友们没有被预选!在我的 PickerActivity 中,我正在调用:
@Override
protected void onResume()
super.onResume();
if (FRIEND_PICKER.equals(getIntent().getData()))
Log.d(LOG, "HERE");
try
if (selectedFriends()!=null)
Log.d(LOG, "U HAVE FRIENDS: " + selectedFriends().size());
friendPickerFragment.setSelection(selectedFriends());
friendPickerFragment.setFriendPickerType(FriendPickerType.TAGGABLE_FRIENDS);
friendPickerFragment.loadData(false);
catch (Exception ex)
onError(ex);
我也试过只调用 setSelection,认为调用 loadData 可能会清除选择...但仍然没有运气。我还注意到我的 PickerActivity(由 Scrumptious fb 教程设计)每次打开朋友选择器时都会调用 onCreate ......可能会强制重新加载数据。有没有人有让这个工作的经验?我现在很难过。提前致谢。
【问题讨论】:
我找到了这个thread,它准确地展示了我在做什么,但是我无法获得任何预选的朋友。但是,我可以看到public void setSelectionByIds(List<String> userIds)
方法正在处理我发送给它的用户 ID。只是不确定为什么 UI 不合作。
好的,所以我一直跟踪到 facebook sdk 类 PickerFragment
在那里我可以看到正确的用户 ID 被正确切换:@Override void toggleSelection(String id)
但是为什么 UI (即,ListItem 复选框)不更新????!!!!!!在selectedIds.add(id);
告诉 UI 更新之后会发生什么?
我将 Facebooks FriendPickerSample 添加到我的工作区,运行它,它可以按预期工作,之前选择的用户仍然被选中...我尝试了它的实现,但没有运气。我注意到每次启动选择器时我的 savedInstanceState 都是空的,所以我猜这与问题有关,因为我每次都在创建一个新的选择器......
好的,所以我的朋友选择器片段似乎每次都被实例化,而不是从片段管理器中提取......不知道为什么会这样,但可能是问题。
所以我发现 FragmentManager 没有保留片段?!当我无法 getFragmentManager().getFragments() 它返回 null...
【参考方案1】:
要理解此回复,您需要阅读上面原始问题下的我的 cmets。
我的发现:当您将 Facebook 的 FriendPickerFragment
更改为输入 FriendPickerType.TAGGABLE_FRIENDS
时,返回的数据设置为不被缓存。这意味着每次显示朋友选择器时都会重新加载数据,这会由于某种原因导致在重新加载完成后不会重新选择任何先前选择的朋友。我仍然不确定为什么会这样,因为 FriendPickerFragment 似乎仍然通过它的 preSelectedFriendIds List<String>
对象引用了那些选定的朋友(因此更好的解决方案可能是确定发生这种情况的原因)。此外,如果您更改 FriendPickerType.TAGGABLE_FRIENDS
以允许缓存,当您重新启动 FriendPickerFragment 时,您会暂时看到您之前选择的朋友实际上已被选中,但随后 FriendPickerFragment 意识到它从缓存中加载了数据(即使只有一些) ,这会导致它刷新它的数据!再次重置之前选择的朋友!
我所做的解决方法:这可能不是解决此问题的最佳方法,因为我确信 Facebook 将 FriendPickerType.TAGGABLE_FRIENDS
设为不可缓存是有原因的。我最初的想法是,这是因为如果它是从缓存中加载的,它可能并不总是包含用户的完整朋友列表,或者可能只是很多朋友(数据)要缓存。但是,我将类型切换为可缓存。然后我在 FriendPickerFragment 中添加了一个boolean
,表明这是否是第一次加载数据。如果您遵循 Facebook 教程,您会看到他们使用名为 populateParameters(Intent intent, String userId, boolean multiSelect, boolean showTitleBar, boolean initialLoad)
的静态方法设置 FriendPickerFragment。在启动 FriendPicker 之前,我检查我的启动 Activity 是否已经显示了 FriendPicker。如果没有,我将 initialLoad 布尔值设置为 true,否则如果它已经显示,我将初始布尔值设置为 false。这个布尔值控制在 Facebook 的 FriendPickerFragment 中的私有类 ImmediateLoadingStrategy
下的 onLoadFinished() 方法:
private class ImmediateLoadingStrategy extends LoadingStrategy
@Override
protected void onLoadFinished(GraphObjectPagingLoader<GraphUser> loader, SimpleGraphObjectCursor<GraphUser> data)
super.onLoadFinished(loader, data);
// We could be called in this state if we are clearing data or if we are being re-attached
// in the middle of a query.
if (data == null || loader.isLoading())
return;
if (data.areMoreObjectsAvailable())
// We got results, but more are available.
followNextLink();
else
// We finished loading results.
hideActivityCircle();
// If this was from the cache, schedule a delayed refresh query (unless we got no results
// at all, in which case refresh immediately.
if (data.isFromCache() && initialLoad==true)
loader.refreshOriginalRequest(data.getCount() == 0 ? CACHED_RESULT_REFRESH_DELAY : 0);
注意添加的检查 && initialLoad==true
- 这 (a) 确保如果这是第一次显示朋友选择器,则更新朋友列表,以及 (b) 如果在此应用程序运行期间已经显示过一次, 不刷新。这样可以确保之前选择的朋友仍然被选中。
如果有人有更好的解决方案,我很想听听 :)
【讨论】:
以上是关于Android - Facebook SDK - FriendPicker setSelected 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
通过 Xamarin.Facebook.Android sdk 登录 Facebook
Android - 使用 facebook sdk 在 facebook 墙上发帖的问题
Android:在eclipse中导入facebook sdk 4.10.1
Android上的Unity Facebook SDK登录错误