Android Facebook登录按钮:应用自定义样式
我在使用新的Facebook android sdk 4时遇到了一个奇怪的问题。 对于我使用的旧sdk版本:Android Facebook登录按钮:应用自定义样式,android,facebook,facebook-android-sdk,Android,Facebook,Facebook Android Sdk,我在使用新的Facebook android sdk 4时遇到了一个奇怪的问题。 对于我使用的旧sdk版本: <com.facebook.login.widget.LoginButton xmlns:fb="http://schemas.android.com/apk/res-auto" android:id="@+id/fb_button" style="@style/FacebookLoginButton" android:layout_width="
<com.facebook.login.widget.LoginButton
xmlns:fb="http://schemas.android.com/apk/res-auto"
android:id="@+id/fb_button"
style="@style/FacebookLoginButton"
android:layout_width="485dp"
android:layout_height="64dp"
android:layout_centerHorizontal="true"
android:layout_marginBottom="-17dp"
fb:login_text="@string/login_with_facebook"
fb:logout_text="Logout" />
style.xml的FacebookLoginButton部分如下所示
<style name="FacebookLoginButton">
<item name="android:background">@drawable/button_facebook</item>
<item name="android:textColor">@color/white</item>
<item name="android:textSize">21sp</item>
<item name="android:gravity">center</item>
</style>
@可拖动/按钮
@颜色/白色
21便士
居中
drawable/button_facebook包含自定义按钮形状的png。
现在,旧版本的sdk一切正常,但新sdk出了问题。我得到这个:
如你所见,有两个facebook图标:带圆圈的一个是facebook按钮,第二个(大的一个)属于按钮(facebook drawable)。有办法隐藏带圆圈的图标吗 甚至我在使用fb登录时也遇到了同样的问题。。。。我通过添加以下代码修复了此问题
fbLoginButton.setBackgroundResource(R.drawable.facebook);
fbLoginButton.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
fbLoginButton.setCompoundDrawablePadding(0);
fbLoginButton.setPadding(0, 0, 0, 0);
fbLoginButton.setText("");
下面是我的xml布局:
<com.facebook.widget.LoginButton
xmlns:fb="http://schemas.android.com/apk/res-auto"
android:id="@+id/fbLoginButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
fb:login_text=""
fb:logout_text=""
android:scaleType="centerInside" />
希望对你有帮助
编辑1:Facebook可能会更改SDK中LoginButton类的位置,因此您可能需要相应地更改XML标记。在我的例子中,它在
com.facebook.widget.LoginButton中
仔细检查。你可以使用android:drawableLeft=“@null”在最新的facebook v4 API中去掉小的facebook
图标,这是正确的答案:
<com.facebook.login.widget.LoginButton
xmlns:facebook="http://schemas.android.com/apk/res-auto"
facebook:com_facebook_login_text="LOGIN"
facebook:com_facebook_logout_text="LOGOUT"/>
然后将以下代码放入onCreate方法中以获取配置文件信息
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
mAccessToken = loginResult.getAccessToken()
.getToken();
PrefUtil.saveData("accesstoken",
mAccessToken, SignIn.this);
GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(org.json.JSONObject object,
GraphResponse response) {
} catch (org.json.JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters
.putString(
"fields",
"id,name,email,gender,birthday,first_name,last_name,location,picture");
request.setParameters(parameters);
request.executeAsync();
}
@Override
public void onCancel() {
Log.i(TAG, "LoginManager FacebookCallback onCancel");
mFbProgressBar.setVisibility(View.GONE);
mFacebookTxt.setVisibility(View.VISIBLE);
if (pendingAction != PendingAction.NONE) {
showAlert();
pendingAction = PendingAction.NONE;
}
}
@Override
public void onError(FacebookException exception) {
mFbProgressBar.setVisibility(View.GONE);
mFacebookTxt.setVisibility(View.VISIBLE);
Log.i(TAG, "LoginManager FacebookCallback onError");
if (pendingAction != PendingAction.NONE
&& exception instanceof FacebookAuthorizationException) {
showAlert();
pendingAction = PendingAction.NONE;
}
}
private void showAlert() {
new AlertDialog.Builder(SignIn.this)
.setTitle(R.string.cancelled)
.setMessage(R.string.permission_not_granted)
.setPositiveButton(R.string.ok, null).show();
}
});
LoginManager.getInstance().registerCallback(callbackManager,
新建FacebookCallback(){
@凌驾
成功时公共无效(LoginResult LoginResult){
MacAccessToken=loginResult.getAccessToken()
.getToken();
PrefUtil.saveData(“accesstoken”,
mAccessToken,签名:此);
GraphRequest请求=GraphRequest.newmereRequest(
loginResult.getAccessToken(),
新建GraphRequest.GraphJSONObjectCallback(){
@凌驾
public void onCompleted(org.json.JSONObject对象,
GraphResponse(反应){
}catch(org.json.JSONException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(例外e){
e、 printStackTrace();
}
}
});
Bundle参数=新Bundle();
参数
putString先生(
“字段”,
“身份证、姓名、电子邮件、性别、生日、名、姓、地点、照片”);
请求。设置参数(参数);
request.executeAsync();
}
@凌驾
公开作废{
i(标记“LoginManager FaceBookCallbackOnCancel”);
mFbProgressBar.setVisibility(View.GONE);
mFacebookTxt.setVisibility(View.VISIBLE);
如果(pendingAction!=pendingAction.NONE){
showarert();
pendingAction=pendingAction.NONE;
}
}
@凌驾
public void onError(facebook异常){
mFbProgressBar.setVisibility(View.GONE);
mFacebookTxt.setVisibility(View.VISIBLE);
i(标记“LoginManager FacebookCallback onError”);
如果(pendingAction!=pendingAction.NONE
&&FacebookAuthorizationException的异常实例(FacebookAuthorizationException){
showarert();
pendingAction=pendingAction.NONE;
}
}
私有void showAlert(){
新建AlertDialog.Builder(登录此)
.setTitle(R.string.cancelled)
.setMessage(R.string.permission\u未授予)
.setPositiveButton(R.string.ok,null).show();
}
});
创建自己的按钮并设置背景图像。。然后点击按钮给facebook打电话..但是你用的是com.facebook.widget.LoginButton,我用的是com.facebook.login.widget.LoginButton,没关系。。。。它表示类LoginButton在facebookSDK中的位置。。。。我可能使用了旧版本的fb。。。添加java代码将解决您的问题。。。我100%确信,gradle构建将失败,因为没有定义login\u text
和logout\u text
anymore@Sierisimo有什么解决办法吗?@Mythul…谢谢…但是你在哪里找到了这方面的文档?如果我没记错的话,它就隐藏在他们的官方文档中。老实说,我确实花了1-2天的时间才发现它。@Mythul…你还有链接吗?提前感谢facebook为什么不将android:drawableLeft更改为android:drawableSTART=“@null”。android:drawableLeft不推荐使用。。。
LoginManager.getInstance().logOut();
LoginManager.getInstance().logInWithReadPermissions(SignIn.this, permissionNeeds);
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
mAccessToken = loginResult.getAccessToken()
.getToken();
PrefUtil.saveData("accesstoken",
mAccessToken, SignIn.this);
GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(org.json.JSONObject object,
GraphResponse response) {
} catch (org.json.JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters
.putString(
"fields",
"id,name,email,gender,birthday,first_name,last_name,location,picture");
request.setParameters(parameters);
request.executeAsync();
}
@Override
public void onCancel() {
Log.i(TAG, "LoginManager FacebookCallback onCancel");
mFbProgressBar.setVisibility(View.GONE);
mFacebookTxt.setVisibility(View.VISIBLE);
if (pendingAction != PendingAction.NONE) {
showAlert();
pendingAction = PendingAction.NONE;
}
}
@Override
public void onError(FacebookException exception) {
mFbProgressBar.setVisibility(View.GONE);
mFacebookTxt.setVisibility(View.VISIBLE);
Log.i(TAG, "LoginManager FacebookCallback onError");
if (pendingAction != PendingAction.NONE
&& exception instanceof FacebookAuthorizationException) {
showAlert();
pendingAction = PendingAction.NONE;
}
}
private void showAlert() {
new AlertDialog.Builder(SignIn.this)
.setTitle(R.string.cancelled)
.setMessage(R.string.permission_not_granted)
.setPositiveButton(R.string.ok, null).show();
}
});