Facebook SDK 3登录按钮单击时识别

时间:2013-03-11 08:40:49

标签: android facebook facebook-android-sdk

我正在使用com.facebook.widget.LoginButton组件登录Facebook:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.splash, container, false);
    LoginButton authButton = (LoginButton) view.findViewById(R.id.login_button);
    stat = (TextView) view.findViewById(R.id.profile_name);
    //authButton.setFragment(this);
    authButton.setReadPermissions(Arrays.asList("user_likes", "user_status",
            "user_status", "user_events", "friends_events"));

    return view;
}

我想提示用户登录状态,所以我需要在按下Facebook按钮时更改文本视图。

但我似乎无法找到识别用户点击的方法,无需更改Facebook的lib,或覆盖LoginButton本机监听器。

4 个答案:

答案 0 :(得分:9)

我在尝试为我的应用程序实现登录lib时遇到了同样的问题。到目前为止,我发现的解决方案,仍然不确定它是否是最好的,是将facebook-sdk中的 LoginClickListener 类从私有更改为 public ,所以我可以覆盖我的Activity上的 onClick 方法。这是我改变的那条线。

自:

private class LoginClickListener implements OnClickListener {
    @Override
    public void onClick(View v) {
        ...

要:

public class LoginClickListener implements OnClickListener {
    @Override
    public void onClick(View v) {
        ...

然后在我的Activity上我可以覆盖onClick方法。

LoginButton facebookButton = (LoginButton) findViewById(R.id.authButton);
facebookButton.setOnClickListener( facebookButton.new LoginClickListener(){
    @Override
    public void onClick(View v) {
        //Do whatever u want
        super.onClick(v);
    }
});
祝你好运。

答案 1 :(得分:2)

查看HelloFacebookSample。他们在那里做了类似的事情。

loginButton.setUserInfoChangedCallback(new LoginButton.UserInfoChangedCallback() {
    @Override
    public void onUserInfoFetched(GraphUser user) {
        updateUI(user);
    }
});

然后在updateUI()方法

private void updateUI(GraphUser user) {
    Session session = Session.getActiveSession();
    if (session != null && session.isOpened() && user != null) {
        mTextView.setText(user.getFirstName());
    }
}

如果您正在关注连接会话(有关详细信息,请参阅示例),即使退出应用程序,也会保留用户登录状态。

答案 2 :(得分:2)

而不是试图覆盖onclick方法或更改Facebook的lib。您可以使用SessionState检测是否已点击loginButton。当SessionState打开时,表示已单击该按钮

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

        Log.e(this.getClass().getName(), "fbSession isNULL "
                + (fbSession == null));

        Log.e(this.getClass().getName(),
                "fbSession state:" + fbSession.getState() + "");

        switch (fbSession.getState()) {
        case CLOSED:
            Log.e(this.getClass().getName(), "CLOSED");

            break;
        case CLOSED_LOGIN_FAILED:
            Log.e(this.getClass().getName(), "CLOSED LOGIN FAILED");

            authButton.setVisibility(View.VISIBLE);
            rl.setVisibility(View.GONE);
            break;
        case CREATED:
            Log.e(this.getClass().getName(), "CREATED");

            break;
        case CREATED_TOKEN_LOADED:
            Log.e(this.getClass().getName(), "CREATED TOKEN LOADED");

            break;
        case OPENED:
            Log.e(this.getClass().getName(), "OPENED");

            break;
        case OPENED_TOKEN_UPDATED:
            Log.e(this.getClass().getName(), "OPENED TOKEN UPDATED");

            break;
        case OPENING:
            Log.e(this.getClass().getName(), "OPENING");

            authButton.setVisibility(View.GONE);
            rl.setVisibility(View.VISIBLE);
            break;
        }

        if (fbSession.isOpened()) {
            Log.e(this.getClass().getName(), "fbSession is opened");

            getFBUserData();
        }
        if (fbSession.isClosed()) {
            Log.e(this.getClass().getName(), "fbSession is closed, logout");
            Token.removeToken(mActivity);
        }
    }

};

答案 3 :(得分:-1)

我没有重载LoginButton,而是使用了图像背景。虽然默认情况下文本没有完全对齐,但使用边距可以提供帮助。

Button fbBtn = (Button)findViewById(R.id.fbLogin) ;
if( fbBtn != null )
{
    fbBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.com_facebook_loginbutton_blue) ) ;
    fbBtn.setText( R.string.prompt_login_yes ) ;
    fbBtn.setTextColor( getResources().getColor(R.color.com_facebook_loginview_text_color) ) ;
    fbBtn.setTextSize( 16 ) ;
    fbBtn.setVisibility(View.VISIBLE) ;
}