java - 如何在 Android 中使用嵌套 fragment 登录 Facebook

标签 java android facebook android-fragments

我有如下嵌套 fragment 。

  • 主要 Activity
    • fragment A
      • fragment A1
        • fragment A3
      • fragment A2
    • fragment B
      • fragment B1

我想从 FragmentA3 登录 facebook。但不能。

在 FragmentA3 中,我的应用在调用 onActivityResult 后在 onResume 停止。

我该怎么办?

fragment A3

public class FragmentA3 extends Fragment {

  public static final String TAG = FragmentA3.class.getCanonicalName();
  private UiLifecycleHelper mFbSdkUiHelper;
  private OnLoggedListener mCallback;
  private final List<String> permissions;

  public OthersFBLogin() {
      // Required empty public constructor
      permissions = Arrays.asList("basic_info", "email");
  }

  public interface OnLoggedListener {
      //Callback to notify about login success.
      public void onLoginSuccess();
  }

  private final Session.StatusCallback mSessionCallback = new Session.StatusCallback() {
      @Override
      public void call(Session session, SessionState state, Exception exception) {
        onSessionStateChange(session, state, exception);
      }
  };

  private void onSessionStateChange(Session session, SessionState state, Exception exception) {
      Log.d(TAG,"onSessionStateChange");
      if (state.isOpened()) {
          mCallback.onLoginSuccess();
      } else if (state.isClosed()) {
          if (session != null) {
              session.closeAndClearTokenInformation();
          }
      }
  }

  @Override
  public void onCreate(Bundle savedInstanceState) {
      Log.d(TAG,"onCreate");
      super.onCreate(savedInstanceState);
      mFbSdkUiHelper = new UiLifecycleHelper(getActivity(), mSessionCallback);
      mFbSdkUiHelper.onCreate(savedInstanceState);
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      Log.d(TAG,"onCreateView");
      View rootView = inflater.inflate(R.layout.others_fblogin, container, false);
      LoginButton loginButton = (LoginButton) rootView.findViewById(R.id.login_button);
      loginButton.setFragment(this);
      loginButton.setReadPermissions(permissions);

      return rootView;
  }

  @Override
  public void onAttach(Activity activity) {
      Log.d(TAG,"onAttach");
      super.onAttach(activity);
      try {
          mCallback = (OnLoggedListener) activity;
      } catch (ClassCastException e) {
          throw new ClassCastException(activity.toString()
                  + " must implement OnLoggedListener in order to use this fragment");
      }
  }

  @Override
  public void onResume() {
      Log.d(TAG,"onResume");
      super.onResume();
      Session session = Session.getActiveSession();
      if (session != null && (session.isOpened() || session.isClosed())) {
          onSessionStateChange(session, session.getState(), null);
      }
      mFbSdkUiHelper.onResume();
  }

  @Override
  public void onDestroyView() {
      super.onDestroyView();
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
      Log.d(TAG,"onActivityResult");
      super.onActivityResult(requestCode, resultCode, data);
      mFbSdkUiHelper.onActivityResult(requestCode, resultCode, data);
  }

  @Override
  public void onPause() {
      Log.d(TAG,"onPause");
      super.onPause();
      mFbSdkUiHelper.onPause();
  }

  @Override
  public void onDestroy() {
      super.onDestroy();
      mFbSdkUiHelper.onDestroy();
  }

  @Override
  public void onSaveInstanceState(Bundle outState) {
      Log.d(TAG,"onSaveInstanceState");
      super.onSaveInstanceState(outState);
      mFbSdkUiHelper.onSaveInstanceState(outState);
  }
}

LogCat

D/com.example.sample.FragmentA3  ﹕ onAttach
D/com.example.sample.FragmentA3  ﹕ onCreate
D/com.example.sample.FragmentA3  ﹕ onCreateView
D/com.example.sample.FragmentA3  ﹕ onResume
D/dalvikvm                       ﹕ GC_FOR_ALLOC freed 764K, 10% free 7977K/8816K, paused 3ms, total 6ms
W/GooglePlayServicesUtil         ﹕ Google Play services is missing.
D/com.example.sample.FragmentA3  ﹕ onPause
D/com.example.sample.FragmentA3  ﹕ onSessionStateChange
W/EGL_emulation                  ﹕ eglSurfaceAttrib not implemented
I/Choreographer                  ﹕ Skipped 174 frames!  The application may be doing too much work on its main thread.
D/com.example.sample.MainActivity﹕ onActivityResult
D/com.example.sample.FragmentA   ﹕ onActivityResult
D/com.example.sample.FragmentA3  ﹕ onActivityResult
D/com.example.sample.FragmentA3  ﹕ onResume

最佳答案

请尝试这个解决方案:

public class FragmentA3 extends Fragment {

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       Fragment fragmentA1 = this.getParentFragment();
       Fragment fragmentA = fragmentA1.getParentFragment();

      loginButton.setFragment(fragmentA);
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
      Log.d(TAG,"onActivityResult");
      super.onActivityResult(requestCode, resultCode, data);
      mFbSdkUiHelper.onActivityResult(requestCode, resultCode, data);
  }
}

public class FragmentA1 extends Fragment {

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
      if (mFragmentA3 !=null)
         mFragmentA3.onActivityResult(requestCode, resultCode, data);

      super.onActivityResult(requestCode, resultCode, data);
  }
}

public class FragmentA extends Fragment {

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
      if (mFragmentA1 !=null)
         mFragmentA1.onActivityResult(requestCode, resultCode, data);

      super.onActivityResult(requestCode, resultCode, data);
  }
}

关于java - 如何在 Android 中使用嵌套 fragment 登录 Facebook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28358074/

相关文章:

java - 如何从包含另一个 XSD 的 XSD 生成类

java - Java泛型语法之间的区别?

android - (Gradle和OrmLite配置)如何在Java编译之后但.apk生成之前添加资源文件?

java - MapFragment - 应用程序可能在其主线程上做了太多工作

android webRTC接收没有音频的调用

html - Facebook 情绪

java - neo4j 直接访问和通过 OGM 之间的显着性能差异

java - 错误 (23,17) 无法解析 junit :junit: 4. 12 @Android Studio v.2

php - 如何使用图形 API 获取 Facebook 用户的电子邮件地址?

javascript - 将其他字段保存在通过 facebook 登录的解析用户中