Reputation: 10580
I am integrating my application with google plus. I have installed google play services and signed in to my account. Also I could publish and plus one for what ever I want.
I can't change the text of the sign in button.
<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+" />
First, I tried adding this line to the xml
android:text="Share on Google+"
Secondly, I tried to set the text programmatically, however it didn't work.
Any help would be appreciated.
If it is not possible, is there any way so I can use the same google sign in button on another button?
Upvotes: 40
Views: 56297
Reputation: 812
Why not create your own simple Google SignIn button using a TextView and the Google logo came up with Google signing library:
<TextView
android:text="Sign In with Google"
android:gravity="center"
android:background="@drawable/<of your choice if required>"
android:padding="16dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="8dp"
app:drawableStartCompat="@drawable/googleg_standard_color_18"/>
Upvotes: 0
Reputation: 26017
Problem:
Other answers have mentioned a workaround. The underlying implementation of the button may change any time which would cause the code to break. I felt uncomfortable trying to use the hacks. For a clean solution, you would think that setting android:text
on the com.google.android.gms.common.SignInButton
in your layout file would do the trick. However it turns out that that attribute is not available for SignInButton
.
Aim
Google's guidelines
From documentation, Google suggests creating a custom button as mentioned on Customizing the Sign-In Button [Archived now. See the archived page here]. It suggests using the branding guidelines as mentioned at Sign-In Branding Guidelines. This includes using the given custom icons and images in the button, setting specific text size, paddings and other do's and don'ts for the logo.
Clean Solution:
Doing as per Google's suggestion involves some custom work. I was willing to do that but wanted to create something reusable, so that others won't have to go through this again. That's why I wrote a quick small (4KB) library does that. Feel free to contribute to it for everyone's benefit if you find issues.
Step 1: Add the following to your app
module level build.gradle
file:
dependencies {
implementation 'com.github.shobhitpuri:custom-google-signin-button:2.0.0'
}
Step 2: Also, add the following in the top-level build.gradle file:
allprojects {
repositories {
google()
maven { url "https://jitpack.io" }
mavenCentral()
}
}
Step 3: In your XML Layout, have the following:
<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>
Usage
android:text="{string}"
: As usual to set the text on the button.
app:isDarkTheme="{Boolean}"
: To switch between blue theme and white theme for the button. The library handles changing of text color and background color. It also handles the change of color on button press or button clicks.
Source:
Hope it helps someone.
Upvotes: 20
Reputation: 403
For kotlin you can do this.
val googleTextView: TextView = SignInButton.getChildAt(0) as TextView
googleTextView.text = "Sign In with Google"
SignInButton is reference to the button id you are using.
Upvotes: 1
Reputation: 21
This worked for me:
XML file
<com.google.android.gms.common.SignInButton
android:id="@+id/google_login_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
/>
<Button
android:id="@+id/new_googlebtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:backgroundTint="@color/white"
android:text="@string/google_login"
android:textColor="@color/black"
app:icon="@drawable/googleg_standard_color_18"
app:iconGravity="textStart"
app:iconPadding="10dp"
app:iconTint="#00100D0D"
app:iconTintMode="src_atop" />
UNMODIFIED MAIN ACTIVITY FILE
google_signInButton=findViewById(R.id.google_login_button);
google_signInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
startActivityForResult(intent, SIGN_IN);
}
});
UPDATED Main Activity file
google_signInButton=findViewById(R.id.google_login_button);
new_googlebtn=findViewById(R.id.new_googlebtn);
new_googlebtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (v== new_googlebtn) {
google_signInButton.performClick();
}
Intent intent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
startActivityForResult(intent, SIGN_IN);
}
});
Upvotes: 1
Reputation: 2213
I encorage not to use those @w.donahue approach since it violates several principles as open/close principle. Best approach it's to customize your own sign in button. If you see documentation about Sign in Google plus button is just a FrameLayout with Textview. At this link https://developers.google.com/+/branding-guidelines#sign-in-button you have material to design the button.
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);
}
The only annoying thing is that even Google + mark with 9 patch extension the PNG they aren't, so you have to edit.
Upvotes: 0
Reputation: 5543
For Beginners
Avoiding few crashes.
try {
((TextView) mGoogleSignOutBtn.getChildAt(0)).setText(R.string.sign_out);
} catch (ClassCastException | NullPointerException e) {
e.printStackTrace();
}
Upvotes: 1
Reputation: 851
Here is the easiest way that I used:
TextView textView = (TextView) signInButton.getChildAt(0);
textView.setText("your_text_xyz");
Upvotes: 36
Reputation: 7203
You can use this class I wrote based on the answer of w.donahue
that you can find in this 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);
}
}
}
Upvotes: 1
Reputation: 19500
android:text
will not work because of Google's Sign in button is a FrameLayout
but not a Button
.
Since text property is only meant for Views representing textual format but not for ViewGroups, your solution is not working.
The only way you can achieve is getting the TextView
defined inside FrameLayout
as explained by w.donahue.
Upvotes: 1
Reputation: 10906
Here is the technique that I used:
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;
}
}
}
Upvotes: 116