3

我正在使用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 的库或覆盖LoginButton本机侦听器。

4

4 回答 4

9

我在尝试为我的应用程序实现登录库时遇到了同样的问题。到目前为止,我发现的解决方案仍然不确定它是否是最好的,将facebook-sdk 中的LoginClickListener类从private更改为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) {
        ...

然后在我的活动中,我可以覆盖 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);
    }
});

祝你好运。

于 2013-03-23T16:50:55.343 回答
2

而不是试图覆盖该onclick方法或更改 Facebook 的库。您可以使用SessionState来检测是否loginButton已单击。当SessionStateOPENING 表示该按钮已被单击

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

};
于 2013-11-06T11:25:12.273 回答
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());
    }
}

如果您关心连接会话(详见示例),那么即使用户退出应用程序,用户登录状态也将保持不变。

于 2013-04-14T16:14:48.420 回答
-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) ;
} 
于 2013-05-16T13:55:52.880 回答