为什么Android Facebook界面不能与Fragments一起使用?

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()在父Activityauthorize()调用的事实,因此您可以使用它为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)

我希望这可以帮助别人.干杯!


sen*_*aux 5

我已经下载了最新版本的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)