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.
Je ne peux pas changer le texte du bouton de connexion.
<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+" />
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.
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?
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;
}
}
}
Voici le moyen le plus simple que j'ai utilisé:
TextView textView = (TextView) signInButton.getChildAt(0);
textView.setText("your_text_xyz");
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.
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 .
Pour les débutants
Éviter quelques accidents.
try {
((TextView) mGoogleSignOutBtn.getChildAt(0)).setText(R.string.sign_out);
} catch (ClassCastException | NullPointerException e) {
e.printStackTrace();
}
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);
}
}
}
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