我正在尝试使用此处的教程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)。
编辑:我无法切换到支持片段,我有一个使用原生片段的大应用。
答案 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来解决了这个问题。
请按照以下说明操作:
在片段的活动中添加以下方法,以捕获并将任何结果传递给片段:
@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);
}
}
在您的片段中覆盖 onActivityResult 也包含,其中包含LoginButton并将结果传递给callbackManager。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
我希望它有效。
答案 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)
请按照以下步骤操作:
删除导入android.app.Fragment;
添加导入android.support.v4.app.Fragment;
右键单击您的项目和选择属性。
构建路径>图书馆>添加外部库>找到你的android-support-v4.jar文件(sdk> extras> android>支持> v4)
答案 4 :(得分:-2)
在 build.gradle 文件
中添加以下内容dependencies {
compile 'com.android.support:support-v4:+'
}
然后导入 android.support.v4.app.Fragment 而不是原生片段。