与本地片段的LoginButton

我正在尝试使用这里的教程来实现Facebook的LoginButton https://developers.facebook.com/docs/android/login-with-facebook/v2.0#step2

问题是在线authButton.setFragment(this);

我使用本机片段(android.app.Fragment),但setFragment期望支持片段(android.support.v4.app.Fragment)。

编辑:我不能切换到支持片段,我有一个使用本机碎片的大应用程序。

Solutions Collecting From Web of "与本地片段的LoginButton"

我认为你正在寻找的解决scheme是下面的包装类。 使用这个,你可以打电话

 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); } } 

我通过使用活动上下文而不是片段上下文并将Activity中的“onActivityResult”传递给callbackManager的片段来解决此问题。

只需按照以下说明操作:

  1. 不要调用loginButton.setFragment(fragment) 。 默认情况下,使用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. 包含LoginButton的片段中重写onActivityResult ,并将结果传递给callbackManager。

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

我希望它的作品。

按着这些次序:

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

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

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

  4. 构buildpath>库>添加外部库>find你的android-support-v4.jar文件(sdk> extras> android> supports> v4)

原因很明显。 Facebook SDK正在使用支持库中的Fragment类,使其向后兼容,并使用旧版本的Android(API Level <11)。 而且你也必须在你的应用程序中使用同一个类。

将支持库android-support-v4.jarlibs文件夹中,并使用它的Fragment类(用于基于Ant的项目)。 如果您正在使用Gradle构build系统,请按照上面雷的回答中的说明进行操作。

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

在下面的build.gradle文件中添加这个

 dependencies { compile 'com.android.support:support-v4:+' } 

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