3

我在我的应用程序中包含了 Fb 登录,当我单击“登录”按钮(com.facebook.widget.LoginButton)时,它会在登录之前打开一个带有对话框的额外活动,如下图所示。为什么会这样?我不想在登录之前打开这个额外的活动。知道怎么做吗?

在此处输入图像描述

在此处输入图像描述

我的主要活动:

public class MainActivity extends SherlockFragmentActivity {

    //Button fblogin;
    Button signup_with_email;
    Button log_in;
    private UiLifecycleHelper uiHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        uiHelper = new UiLifecycleHelper(this, null);
        uiHelper.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initialize();
        setListeners();

    }

    private void initialize() {
        //fblogin = (Button) findViewById(R.id.login_button);
        signup_with_email = (Button) findViewById(R.id.signup_with_email);
        log_in = (Button) findViewById(R.id.log_in);
    }

    private void setListeners() {

        /*fblogin.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

            }
        });
*/
        signup_with_email.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                startActivity(new Intent(MainActivity.this,
                        EmailSignUpActivity.class));
            }
        });

        log_in.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, LoginActivity.class));
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        uiHelper.onResume();

    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        uiHelper.onSaveInstanceState(outState);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        uiHelper.onActivityResult(requestCode, resultCode, data);
        startActivity(new Intent(MainActivity.this, DashBoardActivity.class));
    }

    @Override
    public void onPause() {
        super.onPause();
        uiHelper.onPause();
    }

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}
4

2 回答 2

2

我参加聚会有点晚了,但接受的答案是错误的。

在深入研究 SDK 代码后,我发现:Facebook 为登录过程启动 com.facebook.LoginActivity,由于您没有指定自定义主题,它会显示为您的屏幕截图。这是 LoginActivity 的 JavaDoc:

此活动是整个 Facebook 登录过程的必要部分,但不能直接使用。将此活动添加到您的 AndroidManifest.xml 以确保正确处理 Facebook 登录。

他们建议使用 Theme.Translucent.NoTitleBar:

<activity android:name="com.facebook.LoginActivity"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:label="@string/app_name" />   

但是,如果您使用建议的主题,则 Activity 将是半透明的,但仍会在中间显示一个不确定的 ProgressBar(动画加载符号)。

就个人而言,我更喜欢使用 DialogFragment 来指示加载过程,并且根本不显示 Facebook 的 LoginActivity:

<activity
    android:name="com.facebook.LoginActivity" 
    android:theme="@android:style/Theme.NoDisplay" />
于 2014-09-12T10:30:42.210 回答
1

您将 null 作为第二个参数传递给 UiLifecycleHelper 的构造函数。您需要传递 Session.StatusCallback 的实例。Facebook SDK 教程通常将其显示为 Activity 中的最终字段,如下所示

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

然后,您实现 onSessionStateChange 以在会话打开或关闭时执行您需要执行的任何操作......在您的情况下,您似乎想要在会话状态打开时启动 DashBoardActivity。

无论如何,您都会在短时间内看到一个对话框,因为在 Facebook SDK SSO 过程中,控制暂时传递给本机 Facebook 应用程序以进行授权。一旦授权完成,控制权就会传递给 basck Session.StatusCallback 被调用。

于 2013-04-13T06:29:20.633 回答