我正在使用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
本机监听器。
答案 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) ;
}