Android中的Facebook LoginButton无法使用从XML传递的login_text和logout_text值。

13

Facebook Sdk for Android不能使用从XML传递的login_text和logout_text值。它会忽略它们。目前没有任何文档/示例使用此按钮的自定义功能。

<com.facebook.widget.LoginButton
    xmlns:fb="http://schemas.android.com/apk/res-auto"
    android:id="@+id/connectWithFbButton"
    style="@style/com_facebook_loginview_default_style"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:layout_gravity="center_horizontal"
    android:text="@string/connect_with_facebook"
    fb:login_text="@string/connect_with_facebook"
    fb:logout_text="Connecting with facebook" />

它总是显示“登录”或“退出”。我该如何使用这个属性?我尝试通过LoginButton代码进行调试,但无济于事。它从未经过LoginButton()的任何构造函数,因此无法解析我的自定义参数。

有人遇到过这个问题吗?

6个回答

16

已解决!!

将名称为“com_facebook_loginview_log_in_button”的字符串添加到位于res>values>strings.xml中的strings.xml中。

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="com_facebook_loginview_log_in_button">Connect</string>
<string name="com_facebook_loginview_log_out_button">Your Logout</string>
</resources>

1
"<string name="com_facebook_loginview_log_in_button_long">Connect</string>" 对我来说可行。 - chengbo

5
你的第一个解决方案是正确的。 它没有起作用是因为你定义了样式属性:
style="@style/com_facebook_loginview_default_style"

从LoginButton源代码中:

public LoginButton(Context context, AttributeSet attrs) {
    super(context, attrs);

    if (attrs.getStyleAttribute() == 0) {
        do stuff ...
    }
}

因此,只有在未定义“style”属性时,它才会查看定义的“login_text”属性。

1
在我看来,这应该是被接受的解决方案。对SDK代码进行更改永远不是一个选择。正如Gabriel所指出的那样,删除样式属性就足够了。 - kakoma

2
加布里埃尔说得很对。要解决这个问题,请打开Facebook SDK中的LoginButton.java文件,并将parseAttributes调用移动到以下位置:
parseAttributes(attrs)

将其滚动到底部,使其始终运行。

整个方法看起来像这样:

public LoginButton(Context context, AttributeSet attrs) {
    super(context, attrs);

    if (attrs.getStyleAttribute() == 0) {
            // apparently there's no method of setting a default style in xml,
            // so in case the users do not explicitly specify a style, we need
            // to use sensible defaults.
            this.setTextColor(getResources().getColor(R.color.com_facebook_loginview_text_color));
            this.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                    getResources().getDimension(R.dimen.com_facebook_loginview_text_size));
            this.setPadding(getResources().getDimensionPixelSize(R.dimen.com_facebook_loginview_padding_left),
                    getResources().getDimensionPixelSize(R.dimen.com_facebook_loginview_padding_top),
                    getResources().getDimensionPixelSize(R.dimen.com_facebook_loginview_padding_right),
                    getResources().getDimensionPixelSize(R.dimen.com_facebook_loginview_padding_bottom));
            this.setWidth(getResources().getDimensionPixelSize(R.dimen.com_facebook_loginview_width));
            this.setHeight(getResources().getDimensionPixelSize(R.dimen.com_facebook_loginview_height));
            this.setGravity(Gravity.CENTER);

        if(isInEditMode()) {
            // cannot use a drawable in edit mode, so setting the background color instead
            // of a background resource.
            this.setBackgroundColor(getResources().getColor(R.color.com_facebook_blue));
            // hardcoding in edit mode as getResources().getString() doesn't seem to work in IntelliJ
            loginText = "Log in";
        } else {
            this.setBackgroundResource(R.drawable.com_facebook_loginbutton_blue);
            initializeActiveSessionWithCachedToken(context);
        }
    } 
    parseAttributes(attrs);
}

现在已经考虑了样式和登录文本。对我来说运行良好。


1
我最终只需要更改FacebookSDK源代码中的文本。
登录字符串是com_facebook_loginview_log_in_button,位于FacebookSDK/res/values/strings.xml

为什么要这样黑客攻击?有一种支持的方法可以更改文本。 - greg7gkb
如果你使用Android Studio,就要告别这种程度的控制。 - Mightian
现在没有支持的方法了:https://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/com/facebook/login/widget/LoginButton.java 该方法是私有的,您无法调用它。 - Sierisimo

0
作为一种快捷方式,您可以直接在FB SDK 4.0中的com.facebook.login.widget.LoginButton类-setButtonText()方法中更改登录按钮文本。

0

我尝试了许多解决方案,但都没有起作用,最终我找到了一个解决方法:

Locale loc = Locale.FRENCH;
loginButton = (LoginButton)findViewById(R.id.fb_login_button);
loginButton.setTextLocale(loc);

这会将文本更改为您设置的区域设置,还会更改确认对话框,至少这是我需要的。

希望有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接