Why doesn't Android Facebook interface work with Fragments?

前端 未结 5 551
粉色の甜心
粉色の甜心 2021-01-07 05:21

I\'m switching some Android Facebook code from an Activity to a Fragment. Prior to the switch everything worked fine, but now the

5条回答
  •  -上瘾入骨i
    2021-01-07 05:53

    Actually if you look at Facebook Docs for Android you'll see the login example uses fragment in it.

    There is LoginButton widget that Facebook SDK provides and it has a method called setFragment and you pass the target fragment that you want to use login functionality with.

    In your fragment layout

    Add the login button that Facebook SDK provides.

            
    

    In your fragment

    Create UiLifecycleHelper and StatusCallback objects in your fragment.

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

    Add a method to handle the user state changes.

    private void onSessionStateChange(Session session, SessionState state, Exception exception) {
        if (state.isOpened()) {
            Log.i("LoginFragment", "Logged in...");
            Log.i("LoginFragment", session.getAccessToken());
            doAnythingWithTheFacebookToken(session.getAccessToken());
        } else if (state.isClosed()) {
            // this part is called when user login fails
            Log.i("LoginFragment", "Logged out...");
        }
    }
    

    Override the fragment lifecycle methods

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        uiHelper = new UiLifecycleHelper(getActivity(), callback);
        uiHelper.onCreate(savedInstanceState);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
        // inflate your fragment view
    
        facebookLoginButton = (LoginButton) view.findViewById(R.id.facebook_login_button);
        facebookLoginButton.setFragment(this);
    }
    
    @Override
    public void onResume() {
        super.onResume();
        // For scenarios where the main activity is launched and user
        // session is not null, the session state change notification
        // may not be triggered. Trigger it if it's open/closed.
        Session session = Session.getActiveSession();
        if (session != null &&
                (session.isOpened() || session.isClosed())) {
            onSessionStateChange(session, session.getState(), null);
        }
    
        uiHelper.onResume();
    }
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        uiHelper.onActivityResult(requestCode, resultCode, data);
    }
    
    @Override
    public void onPause() {
        super.onPause();
        uiHelper.onPause();
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        uiHelper.onDestroy();
    }
    
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        uiHelper.onSaveInstanceState(outState);
    }
    

    Result

    Normally you'd need to override onActivityResult in your activity but calling setFragment() on Facebook Login Button allows your fragment to receive the result in its own onActivityResult.

    If you want to use a different button (your own button for example):

    • hide the facebookLoginButton in layout

    • call performClick() on facebookLoginButton inside the onclick listener of your actual button

    That's it.

提交回复
热议问题