LoginButton与本机Fragment

时间:2014-07-09 02:43:38

标签: android facebook-android-sdk

我正在尝试使用此处的教程https://developers.facebook.com/docs/android/login-with-facebook/v2.0#step2

来实现Facebook LoginButton

问题在于authButton.setFragment(this);

我使用的是原生片段(android.app.Fragment),但是setFragment需要支持片段(android.support.v4.app.Fragment)。

编辑:我无法切换到支持片段,我有一个使用原生片段的大应用。

5 个答案:

答案 0 :(得分:14)

我认为您正在寻找的解决方案是下面的包装类。使用此功能,您只需拨打

即可
authButton.setFragment(new NativeFragmentWrapper(this));

包装器是一个支持片段,只是将方法调用从facebook LoginButton传递给本机片段。我使用它并且工作正常。

public class NativeFragmentWrapper extends android.support.v4.app.Fragment {
    private final Fragment nativeFragment;

    public NativeFragmentWrapper(Fragment nativeFragment) {
        this.nativeFragment = nativeFragment;
    }

    @Override
    public void startActivityForResult(Intent intent, int requestCode) {
        nativeFragment.startActivityForResult(intent, requestCode);
    }

    @Override
    public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        nativeFragment.onActivityResult(requestCode, resultCode, data);
    }
}

答案 1 :(得分:5)

我通过使用活动上下文而不是片段上下文并将“onActivityResult”从Activity传递到片段到callbackManager来解决了这个问题。

请按照以下说明操作:

  1. 不要调用 loginButton.setFragment(片段)。默认情况下,使用LoginButton的Activity上下文。
  2. 在片段的活动中添加以下方法,以捕获并将任何结果传递给片段:

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        final MyFragment fragment = (MyFragment) getFragmentManager().findFragmentById(R.id.container);
        if (fragment != null) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }
    
  3. 在您的片段中覆盖 onActivityResult 也包含,其中包含LoginButton并将结果传递给callbackManager。

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
    
  4. 我希望它有效。

答案 2 :(得分:0)

原因很明显。 Facebook SDK使用支持库中的Fragment类使其向后兼容并与旧版本的android(API Level< 11)一起使用。您必须在您的应用程序中使用相同的类。

将支持库android-support-v4.jar包含在libs文件夹中,并使用其中的Fragment类(对于基于Ant的项目)。如果您使用的是Gradle构建系统,请按照上面Lei的答案中的说明进行操作。

更新:如果您的应用程序与本机库具有高度依赖性,那么您只剩下一个选项。 Facebook SDK代码可用here。分叉并更改SDK以使用本机库(从SDK本身删除支持库)。但请记住,您的应用程序将限制为在大于10的API级别上运行(minSdkVersion应为11)。

答案 3 :(得分:0)

请按照以下步骤操作:

  1. 删除导入android.app.Fragment;

  2. 添加导入android.support.v4.app.Fragment;

  3. 右键单击您的项目和选择属性。

  4. 构建路径>图书馆>添加外部库>找到你的android-support-v4.jar文件(sdk> extras> android>支持> v4)

答案 4 :(得分:-2)

build.gradle 文件

中添加以下内容
dependencies {
    compile 'com.android.support:support-v4:+'
}

然后导入 android.support.v4.app.Fragment 而不是原生片段。