gcl*_*cl1 2 android facebook-android-sdk android-fragments actionbarsherlock fragmentpageradapter
我正在将一些Android Facebook代码从一个转换Activity为一个Fragment.在切换之前一切正常,但现在onComplete()回调没有被执行.
Facebook代码不能与Fragments一起使用,或者我做错了什么?
这是原始代码(在a中SherlockActivity):
if (!mFacebook.isSessionValid()) {
mFacebook.authorize(MyActivity.this, permissions, new DialogListener() {
@Override
public void onComplete(Bundle values) { ... } // CALLED AS EXPECTED
}
}
Run Code Online (Sandbox Code Playgroud)
这是新代码(在SherlockFragment中):
if (!mFacebook.isSessionValid()) {
mFacebook.authorize(getActivity(), permissions, new DialogListener() {
@Override
public void onComplete(Bundle values) { ... } // DOES NOT GET CALLED
}
}
Run Code Online (Sandbox Code Playgroud)
Activity和Fragment都包含与Facebook要求相同的onActivityResult():
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mFacebook.authorizeCallback(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
编辑:在这里问一个类似的问题,接受的答案是将其Fragment改为a FragmentActivity.但我不知道这有什么帮助,因为它不再是Fragment(我出于其他原因需要).建议?
编辑2:我推出了自己的解决方案.见下文.
gcl*_*cl1 12
据我所知,Facebook auth API不支持Fragments.具体来说,onComplete()来自Facebook authorize()调用的回调适用于活动,但不适用于碎片.
所以我为Fragments整理了一个简单的解决方法.解决方案取决于调用完成时onActivityResult()在父Activity中authorize()调用的事实,因此您可以使用它为Fragment设置单独的回调机制.
首先,在父Activity中设置一个变量来携带目标片段的名称,比如说
TargetFragment mTargetFragment;
Run Code Online (Sandbox Code Playgroud)
您可以在首次实例化Fragment时初始化它:
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
String fragmentSimpleName = fragment.getClass().getSimpleName();
if (fragmentSimpleName.equals("TargetFragment"))
mTargetFragment = (TargetFragment)fragment;
}
Run Code Online (Sandbox Code Playgroud)
然后在onActivityResult()函数中添加几行:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (mTargetFragment != null)
mTargetFragment.myCallBack(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)
现在你可以模仿你通常会在新的myCallBack()函数中放入onComplete()回调中的代码:
public void myCallBack(int requestCode, int resultCode, Intent data) {
mFacebook.authorizeCallback(requestCode, resultCode, data);
// other code from your onComplete() function ...
}
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助别人.干杯!
我已经下载了最新版本的Facebook SDK,我遇到了同样的问题,gcl1的解决方案工作正常,但我必须在活动结果上做更多的事情,所以我在父活动上做了这个:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (mTargetFragment != null) {
mTargetFragment.onActivityResult(requestCode, resultCode, data);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4970 次 |
| 最近记录: |