web-dev-qa-db-fra.com

Puis-je modifier le texte du bouton de connexion sur Google?

J'intègre mon application avec Google Plus. J'ai installé les services de Google Play et connecté à mon compte. Aussi, je pourrais publier et plus un pour tout ce que je veux.

Mon problème

Je ne peux pas changer le texte du bouton de connexion.

Mon code 

<com.google.Android.gms.common.SignInButton
        Android:id="@+id/share_button"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_horizontal"
        Android:text="Share on Google+" />

Qu'est-ce que j'ai essayé? 

  • J'ai d'abord essayé d'ajouter cette ligne au xml 

    Android:text="Share on Google+"
    
  • Deuxièmement, j'ai essayé de définir le texte par programme, mais cela n'a pas fonctionné.

Toute aide serait appréciée.

Modifier

Si ce n'est pas possible, y a-t-il un moyen pour que je puisse utiliser le même bouton de connexion Google sur un autre bouton?

25
Marco Dinatsoli

Voici la technique que j'ai utilisée:

protected void setGooglePlusButtonText(SignInButton signInButton, String buttonText) {
    // Find the TextView that is inside of the SignInButton and set its text
    for (int i = 0; i < signInButton.getChildCount(); i++) {
        View v = signInButton.getChildAt(i);

        if (v instanceof TextView) {
            TextView tv = (TextView) v;
            tv.setText(buttonText);
            return;
        }
    }
}
92
w.donahue

Voici le moyen le plus simple que j'ai utilisé:

    TextView textView = (TextView) signInButton.getChildAt(0);
    textView.setText("your_text_xyz");
24
Sankar Behera

Problème:

D'autres réponses ont mentionné une solution de contournement. L'implémentation sous-jacente du bouton peut changer à tout moment, ce qui provoquerait une rupture du code. Je me sentais mal à l'aise d'essayer d'utiliser les hacks. Pour une solution propre, vous penseriez que définir Android:text sur le com.google.Android.gms.common.SignInButton dans votre fichier de présentation ferait l'affaire. Cependant, il s'avère que cet attribut n'est pas disponible pour SignInButton.

Objectif

Directives de Google

Dans la documentation, Google suggère de créer un bouton personnalisé, comme indiqué à la section Personnalisation du bouton de connexion . Ensuite, il vous suggère d’utiliser les directives relatives à l’image de marque, comme indiqué à Instructions pour l’identification de marque d’ouverture de session . Cela inclut l’utilisation des icônes et des images personnalisées données dans le bouton, la définition de la taille du texte, des marges et autres tâches à faire et à ne pas faire pour le logo. 

Solution propre:

Faire selon la suggestion de Google implique un travail personnalisé. J'étais prêt à faire cela, mais je voulais créer quelque chose de réutilisable, pour que les autres ne soient pas obligés de recommencer. C'est pourquoi j'ai écrit une petite bibliothèque rapide (4 Ko) qui le fait. N'hésitez pas à y contribuer pour le bénéfice de tous si vous rencontrez des problèmes.

  • Étape 1: Ajoutez les éléments suivants à votre fichier app de niveau de module build.gradle:

    dependencies {
        compile 'com.shobhitpuri.custombuttons:google-signin:1.0.0'
    }
    
  • Étape 2: Dans votre mise en page XML, procédez comme suit:

    <RelativeLayout
        ...
        xmlns:app="http://schemas.Android.com/apk/res-auto">
    
        <com.shobhitpuri.custombuttons.GoogleSignInButton
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_centerInParent="true"
            Android:text="@string/google_sign_up"
            app:isDarkTheme="true" />
    </RelativeLayout>
    

Utilisation

  • Android:text="{string}": comme d'habitude pour définir le texte sur le bouton.

  • app:isDarkTheme="{Boolean}": Pour basculer entre le thème bleu et le thème blanc pour le bouton. La bibliothèque gère le changement de la couleur du texte et de la couleur d'arrière-plan. Il gère également le changement de couleur lorsque vous appuyez ou que vous cliquez sur un bouton.

La source:

J'espère que ça aide quelqu'un.

11
Shobhit Puri

Android:text ne fonctionnera pas car le bouton de connexion de Google est une FrameLayout mais pas une Button.

Étant donné que la propriété text ne concerne que les vues représentant un format textuel, mais pas les ViewGroups, votre solution ne fonctionne pas.

La seule façon d'obtenir ce résultat est d'obtenir la TextView définie dans FrameLayout, comme expliqué parw.donahue .

1
Chandra Sekhar

Pour les débutants  

Éviter quelques accidents.

try {
            ((TextView) mGoogleSignOutBtn.getChildAt(0)).setText(R.string.sign_out);
} catch (ClassCastException | NullPointerException e) {
            e.printStackTrace();
}
1
Napolean

Vous pouvez utiliser cette classe que j'ai écrite en fonction de la réponse de w.donahue que vous pouvez trouver dans cette page:

import Android.content.Context;
import Android.util.AttributeSet;
import Android.view.Gravity;
import Android.view.View;
import Android.widget.FrameLayout;
import Android.widget.TextView;

import com.google.Android.gms.common.SignInButton;

public class GoogleLoginButton extends FrameLayout implements View.OnClickListener{

    private SignInButton signInButton;
    private OnClickListener onClickListener;

    public GoogleLoginButton(Context context) {
        super(context);
        init();
    }

    public GoogleLoginButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public GoogleLoginButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        signInButton = new SignInButton(getContext());
        signInButton.setSize(SignInButton.SIZE_STANDARD);
        setGooglePlusButtonText(signInButton, "Test");
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.gravity = Gravity.CENTER;
        addView(signInButton, params);
    }

    protected void setGooglePlusButtonText(SignInButton signInButton, String buttonText) {
        // Find the TextView that is inside of the SignInButton and set its text
        for (int i = 0; i < signInButton.getChildCount(); i++) {
            View v = signInButton.getChildAt(i);

            if (v instanceof TextView) {
                TextView tv = (TextView) v;
                tv.setText(buttonText);
                return;
            }
        }
    }

    @Override
    public void setOnClickListener(OnClickListener onClickListener) {
        this.onClickListener = onClickListener;
        if(this.signInButton != null) {
            this.signInButton.setOnClickListener(this);
        }
    }

    @Override
    public void onClick(View v) {
        if(this.onClickListener != null && v == this.signInButton) {
            this.onClickListener.onClick(this);
        }
    }
}
0
madx

J'encourage de ne pas utiliser ces @ w.donahue aproach puisque violette plusieurs principes comme principe ouvert/fermé. Le meilleur apraoch est de personnaliser votre propre bouton. Si vous voyez la documentation sur Sing dans Google plus, le bouton est juste un frameLayout avec textview. sur ce lien https://developers.google.com/+/branding-guidelines#sign-in-button vous avez du matériel pour concevoir le bouton.

public class GplusButton extends FrameLayout {

private final String logIn="log in with google +";

private final String logOut="log out";

TextView labelTV;

public GplusButton(Context context) {
    super(context, null);
}

public GplusButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    setBackgroundResource(R.drawable.btn_g_plus_signin_normal);
    addTextLabel();
}

public void addTextLabel() {
    labelTV = new TextView(getContext());
    setTextLogIn();
    labelTV.setTextColor(Color.WHITE);
    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    params.gravity = Gravity.CENTER;
    addView(labelTV, params);
}

public void setTextLogIn(){
    labelTV.setText(logIn);
}

public void setTextLogOut(){
    labelTV.setText(logOut);

}

La seule chose gênante est que même Google + marque avec une extension de patch de 9 le png qu’ils ne sont pas, vous devez donc éditer

0
Xenione