Facebook 登录按钮:应用自定义样式
Facebook Login button: apply custom style
我在使用新的 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="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>
drawable/button_facebook 包含自定义按钮形状的 png。
现在旧版本的 sdk 一切正常,但是新的 sdk 出了点问题。我得到这个:
如您所见,有两个 facebook 图标:圈出的一个是 facebook 按钮,第二个(大的)属于 button_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 class 的位置,因此您可能需要相应地更改 XML 标签。在我的例子中,它在里面 com.facebook.widget.LoginButton
仔细检查它。
您可以只使用 android:drawableLeft="@null"
去掉小 Facebook
图标
在最新的 Facebook v4 API 这是正确答案:
<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"/>
<FrameLayout
android:id="@+id/facebook_lay"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
android:background="@drawable/facebook_button_bg">
<com.lovetohave.love.ui.LoveTextView
android:id="@+id/facebook_txt"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:gravity="center"
android:text="@string/facebook"
android:textColor="@color/white"
android:textSize="@dimen/material_small"
app:customFont="fonts/Roboto-Medium.ttf" />
<com.rey.material.widget.ProgressView
android:id="@+id/fb_progress_view_cir"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="center"
android:visibility="gone"
app:cpd_strokeColor="#fff"
app:cpd_strokeSize="1dp"
app:pv_autostart="true"
app:pv_circular="true"
app:pv_progressMode="indeterminate"
app:pv_progressStyle="@style/CircularProgress1" />
</FrameLayout>
你可以像textview或者button那样设计,在button的点击事件中添加如下代码。
LoginManager.getInstance().logOut();
LoginManager.getInstance().logInWithReadPermissions(SignIn.this, permissionNeeds);
然后在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();
}
});
我在使用新的 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="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>
drawable/button_facebook 包含自定义按钮形状的 png。 现在旧版本的 sdk 一切正常,但是新的 sdk 出了点问题。我得到这个:
如您所见,有两个 facebook 图标:圈出的一个是 facebook 按钮,第二个(大的)属于 button_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 class 的位置,因此您可能需要相应地更改 XML 标签。在我的例子中,它在里面 com.facebook.widget.LoginButton
仔细检查它。
您可以只使用 android:drawableLeft="@null"
去掉小 Facebook
图标
在最新的 Facebook v4 API 这是正确答案:
<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"/>
<FrameLayout
android:id="@+id/facebook_lay"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
android:background="@drawable/facebook_button_bg">
<com.lovetohave.love.ui.LoveTextView
android:id="@+id/facebook_txt"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:gravity="center"
android:text="@string/facebook"
android:textColor="@color/white"
android:textSize="@dimen/material_small"
app:customFont="fonts/Roboto-Medium.ttf" />
<com.rey.material.widget.ProgressView
android:id="@+id/fb_progress_view_cir"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="center"
android:visibility="gone"
app:cpd_strokeColor="#fff"
app:cpd_strokeSize="1dp"
app:pv_autostart="true"
app:pv_circular="true"
app:pv_progressMode="indeterminate"
app:pv_progressStyle="@style/CircularProgress1" />
</FrameLayout>
你可以像textview或者button那样设计,在button的点击事件中添加如下代码。
LoginManager.getInstance().logOut();
LoginManager.getInstance().logInWithReadPermissions(SignIn.this, permissionNeeds);
然后在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();
}
});