0

hereFragmentの例に従って、Facebook Android SDK 3.5.2 を使用して Facebook のログイン/ログアウトを管理するために を作成しまし

Facebook Web ウィジェットによるログイン プロセスが完了すると、MainActivityが再び開始されます (onCreateが呼び出されます)。

次に、サンプル コードの if savedInstanceState!=nullinMainActivityonCreateでは、既存のインスタンスを復元する必要があるかどうか、または新しいインスタンスを作成する必要があるかsavedInstanceStateどうかがチェックされます。FacebookPrefsFragment

if (savedInstanceState == null) {
    // Add the fragment on initial activity setup
    mainFragment = new MainFragment();
    getSupportFragmentManager()
    .beginTransaction()
    .add(android.R.id.content, mainFragment)
    .commit();
} else {
    // Or set the fragment from restored state info
    mainFragment = (MainFragment) getSupportFragmentManager()
    .findFragmentById(android.R.id.content);
}

私の問題は、 my にMainActivityは多くのFragmentsがありsavedInstanceState、Facebook のログイン プロセス時だけでなく null にできないことです。だから私は2つの質問があります:

  • MainActivityFacebook のログイン プロセス後に が再度作成されるのはなぜですか? を呼び出すだけでよいFacebookPrefsFragmentのではないonActivityResultですか?

  • 作成される場合、それが Facebook SDK によって呼び出されたものであることをどのように知ることができますか?

主な活動

public class MainActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {       

            // If the Activity has been started after the Facebook login process, restart the FacebookPrefsFragment,
            // but how can I be sure that MainActivity has been called by the Facebook app?

            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            Fragment facebookPrefsFragment = new FacebookPrefsFragment();       
            fragmentTransaction.replace(R.id.content_container, facebookPrefsFragment, "facebookPrefsFragment");
            fragmentTransaction.commit();
        }
        else{
            // start other Fragment
        }
    }

    // ...
}

FacebookPrefsFragment

public class FacebookPrefsFragment extends Fragment{

    private void onSessionStateChange(Session session, SessionState state, Exception exception) {
        if (state.isOpened()) {
            Log.i(this.getClass().getSimpleName(), "Logged in", MyApplication.LOG_LEVEL);
        } else if (state.isClosed()) {
            Log.i(this.getClass().getSimpleName(), "Logged out", MyApplication.LOG_LEVEL);
        }
    }

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

    private UiLifecycleHelper uiHelper;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.facebook_prefs, container, false);

        LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
        authButton.setPublishPermissions(Arrays.asList("publish_actions"));
        authButton.setFragment(this);

        return view;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        uiHelper = new UiLifecycleHelper(getActivity(), callback);
        uiHelper.onCreate(savedInstanceState);
    }

    @Override
    public void onResume() {
        super.onResume();

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

3 に答える 3

1

あなたはで遊ぶ必要があります

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

アプリケーションの送信元であるリクエスト コードを確認します。ソース: https://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/com/facebook/widget/FacebookDialog.java#L210

数か月前にテストしました。requestCode は、アプリが Facebook から戻ってくるかどうかを識別するために使用できるものです。

[編集]

これは醜いハックですがrequestCode == 64206、あなたのアクティビティが Facebook から戻ってきた場合です。

于 2013-10-04T07:13:01.130 に答える
0

おっと、毎回 が再作成される理由がわかりました。これMainActivityは、携帯電話で [アクティビティを保持しない] オプションが有効になっているためです。その場合どうすればいいのか、今から調べないといけないのですが…

于 2013-10-04T10:26:16.020 に答える